【Github】Git 简易教程
介绍
1.1 Why Git?
- 用一个文件进行日期和版本号的迭代
- 管理基于本文信息的文件:文本文件(.txt),脚本文件(.py)
- 不擅长管理的文件:图片文件(.jpg),MS文档(.doc)
1.2 Git 安装
1. git-downloads: https://git-scm.com/downloads
2. 右侧会自动识别当前系统的最新版本,直接点击下载即可
3. introduction:./Git/ReleaseNotes.html
创建/修改 版本库
2.1 Repository
init(创建版本库)
1. 打开Terminal(Windows 的 git bash)
2. 切换路径
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ cd ~/Desktop/gitTUT
3. 添加用户 name 和用户 email
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git config --global user.name "dongyu lin" 2 $ git config --global user.email "dongyulin@email.com"
4. 该路径下建立git 的管理文件 .git
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git init 2 # Initialized empty Git repository in C:/Users/xxx/Desktop/gitTUT/.git/
此时文件夹中没有任何文件,所以返回告诉我们已经建立了一个空的git 管理库
add(添加文件管理)
1.1 查看文件夹中的所有文件(仅显式文件)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ ls
1.2 查看文件夹中的所有文件(含隐藏文件,如.git)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ ls -a 2 # ./ ../ .git/
2. 建立新的文件 main.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ touch main.py
3. 查看版本库的状态
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git status 2 3 # 输出 4 On branch master #在master 分支 5 6 No commits yet 7 8 Untracked files: 9 (use "git add <file>..." to include in what will be committed) 10 main.py #main.py还没有加入到版本库中(unstaged,显示红色) 11 12 nothing added to commit but untracked files present (use "git add" to track)
4.1 将文件main.py 添加至版本库
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git add main.py 2 3 # 再次查看状态 4 $ git status 5 6 # 输出 7 On branch master 8 9 No commits yet 10 11 Changes to be committed: 12 (use "git rm --cached <file>..." to unstage) 13 new file: main.py #版本库已识别 main.py(staged, 显示绿色)
4.2 一次性添加所有文件夹中未添加的文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git add .
commit(提交改变)
1. 提交状态变更,并通过-m 自定义改变的信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git commit -m "create main.py" 2 3 # 输出 4 [master (root-commit) 32ba8cb] create main.py 5 1 file changed, 0 insertions(+), 0 deletions(-) 6 create mode 100644 main.py
流程图
2.2 log & diff
log(操作日志)
1. 查看log
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git log 2 3 # 输出 4 commit 32ba8cb21a13f46ac74b957aecc541ad6baa7303 (HEAD -> master) 5 Author: dongyu lin <dongyulin@email.com> 6 Date: Mon Nov 30 02:58:58 2020 +0800 7 8 create main.py #创建文件的操作记录
2. 修改文件并查看log
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # main.py 中添加一行代码:a=1 2 3 $ git status 4 5 # 输出 6 On branch master 7 Changes not staged for commit: 8 (use "git add <file>..." to update what will be committed) 9 (use "git restore <file>..." to discard changes in working directory) 10 modified: main.py #文件已修改但并未提交(显示红色) 11 12 no changes added to commit (use "git add" and/or "git commit -a")
3. 添加(add)修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git add main.py
4. 提交(commit)修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git commit -m "change a=1" 2 3 #输出 4 [master 693ee47] change a=1 5 1 file changed, 1 insertion(+) #提示文件有一处添加
5. 变更之后查看log
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git log 2 3 # 输出 4 commit 693ee47f323013129611ab00ceee77bf5787eec4 (HEAD -> master) 5 Author: dongyu lin <dongyulin@email.com> 6 Date: Mon Nov 30 03:19:42 2020 +0800 7 8 change a=1 9 10 commit 32ba8cb21a13f46ac74b957aecc541ad6baa7303 11 Author: dongyu lin <dongyulin@email.com> 12 Date: Mon Nov 30 02:58:58 2020 +0800 13 14 create main.py
diff:查看unstaged 状态的修改部分(还没add)与上个commit 的文件有何不同
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #上次提交的文件 a=1 2 # 本次修改后未add 的文件 a=2 b=1 3 4 $ git diff 5 6 #输出 7 diff --git a/main.py b/main.py 8 index d25d49e..61ce15f 100644 9 --- a/main.py 10 +++ b/main.py 11 @@ -1 +1,2 @@ 12 -a = 1 #删除了 a=1 13 \ No newline at end of file 14 +a = 2 #添加了 a=2 15 +b = 1 #添加了 b=1 16 \ No newline at end of file
diff --cached:查看staged 状态的修改部分(已经add,还没commit)与上个commit 的文件有何不同
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git add . #add 全部修改文件 2 $ git diff --cached #查看add之后的文件差异 3 4 # 输出 5 diff --git a/main.py b/main.py 6 index d25d49e..61ce15f 100644 7 --- a/main.py 8 +++ b/main.py 9 @@ -1 +1,2 @@ 10 -a = 1 11 \ No newline at end of file 12 +a = 2 13 +b = 1 14 \ No newline at end of file
diff HEAD:同时查看unstaged 和staged 状态的修改部分与上个commit 的文件有何不同
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 上次commit 的文件 a=1 2 # 本次add过a=2 b=1,还没add过c=b 3 4 $ git diff HEAD #unstaged & staged 5 6 # 输出 7 diff --git a/main.py b/main.py 8 index d25d49e..ac13cf6 100644 9 --- a/main.py 10 +++ b/main.py 11 @@ -1 +1,3 @@ 12 -a = 1 13 \ No newline at end of file 14 +a = 2 15 +b = 1 16 +c = b 17 \ No newline at end of file
比较
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git diff HEAD #unstaged & staged 2 3 # 输出 4 diff --git a/main.py b/main.py 5 index d25d49e..ac13cf6 100644 6 --- a/main.py 7 +++ b/main.py 8 @@ -1 +1,3 @@ 9 -a = 1 10 \ No newline at end of file 11 +a = 2 12 +b = 1 13 +c = b 14 \ No newline at end of file 15 16 $ git diff #unstaged 17 18 #输出 19 diff --git a/main.py b/main.py 20 index 61ce15f..ac13cf6 100644 21 --- a/main.py 22 +++ b/main.py 23 @@ -1,2 +1,3 @@ 24 a = 2 # 前面没有+ 25 \ No newline at end of file 26 b = 1 # 前面没有+ 27 +c = b 28 \ No newline at end of file 29 30 $ git diff --cached #staged 31 32 # 输出 33 diff --git a/main.py b/main.py 34 index d25d49e..61ce15f 100644 35 --- a/main.py 36 +++ b/main.py 37 @@ -1 +1,2 @@ 38 -a = 1 39 \ No newline at end of file 40 +a = 2 41 +b = 1 42 \ No newline at end of file
回到从前
3.1 reset(针对整个版本库)
commit --amend(添加修改至上次commit 的版本)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ touch 2.py #创建文件 2 $ git add 2.py #添加文件 3 4 $ git commit --amend --no-edit #"--no-edit":不编辑,直接合并到上一个commit 5 # 输出 6 [master 6cfc14d] change 2 7 Date: Mon Nov 30 03:47:46 2020 +0800 8 2 files changed, 3 insertions(+), 1 deletion(-) 9 create mode 100644 2.py 10 11 $ git log --oneline #"--oneline":每个commit 内容显示在一行 12 # 输出 13 6cfc14d (HEAD -> master) change 2 #添加过2.py文件的change 2 14 693ee47 change a=1 15 32ba8cb create main.py
reset(回到上个add)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #main.py添加一行代码:d=4 2 3 $ git add main.py 4 5 $ git status -s 6 # 输出 7 M main.py #staged(显示绿色) 8 9 $ git reset main.py 10 # 输出 11 Unstaged changes after reset: 12 M main.py 13 14 $ git status -s 15 M main.py #unstaged(显示红色)
reset --hard HEAD(回到上个commit)
git指针
每个 commit
都有自己的 id
数字号, HEAD
是一个指针, 指引当前的状态是在哪个 commit
. 最近的一次 commit
在最右边, 我们如果要回到过去, 就是让 HEAD
回到过去并 reset
此时的 HEAD
到过去的位置.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git log --oneline #查看所有commit的id 2 # 输出 3 7f82abd (HEAD -> master) change 2 4 693ee47 change a=1 5 32ba8cb create main.py 6 7 #HEAD 显示当前commit 8 $ git reset --hard HEAD 9 HEAD is now at 7f82abd change 2 10 11 #HEAD 回到前一个commit 12 $ git reset --hard HEAD^ 13 # 输出 14 HEAD is now at 693ee47 change a=1 15 16 #HEAD 回到任意commit 17 $ git reset --hard 32ba8cb 18 # 输出 19 HEAD is now at 32ba8cb create main.py 20 21 #查看log中的HEAD变更日志 22 $ git reflog 23 7f82abd (HEAD -> master) HEAD@{0}: reset: moving to 7f82abd 24 32ba8cb HEAD@{1}: reset: moving to HEAD 25 32ba8cb HEAD@{2}: reset: moving to 32ba8cb 26 693ee47 HEAD@{3}: reset: moving to HEAD 27 693ee47 HEAD@{4}: reset: moving to HEAD^ 28 7f82abd (HEAD -> master) HEAD@{5}: reset: moving to HEAD 29 7f82abd (HEAD -> master) HEAD@{6}: commit (amend): change 2 30 6cfc14d HEAD@{7}: commit (amend): change 2 31 8036b1a HEAD@{8}: commit: change 2 32 693ee47 HEAD@{9}: commit: change a=1 33 32ba8cb HEAD@{10}: commit (initial): create main.py
3.2 checkout (针对单个文件)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 """ 2 create main.py 3 创建main.py文件 4 5 change a=1 6 仅对main.py 文件 7 a=1 8 9 change 2 10 仅对main.py 文件 11 a=2 12 b=1 13 c=b 14 d=4 15 创建2.py 文件 16 17 change 3 18 仅对2.py 文件 19 a=2 20 b=1 21 c=b 22 d=4 23 """ 24 $ git log --oneline 25 # 输出 26 67b64b2 (HEAD -> master) change 3 27 7f82abd change 2 28 693ee47 change a=1 29 32ba8cb create main.py 30 31 #仅main.py 文件回到change a=1 的状态 32 $ git checkout 693ee47 -- main.py #此时main.py内容变为a=1 33 34 $ git add main.py 35 $ git commit -m "back to change 1 and add commit for main.py" 36 # 输出 37 [master cbf7a0e] back to change 1 and add commit for main.py 38 1 file changed, 1 insertion(+), 4 deletions(-) 39 40 $ git log --oneline 41 # 输出 42 cbf7a0e (HEAD -> master) back to change 1 and add commit for main.py #此时并未改写change a=1,而是重新添加一个commit 43 67b64b2 change 3 44 7f82abd change 2 45 693ee47 change a=1 46 32ba8cb create main.py
分支管理
4.1 branch
之前我们说编辑的所有改变都是在一条主分支 master
上进行的. 通常我们会把 master
当作最终的版本, 而开发新版本或者新属性的时候, 在另外一个分支上进行, 这样就能使开发和使用互不干扰了
graph(查看分支内容)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git log --oneline --graph 2 # 输出 3 * cbf7a0e (HEAD -> master) back to change 1 and add commit for main.py 4 * 67b64b2 change 3 5 * 7f82abd change 2 6 * 693ee47 change a=1 7 * 32ba8cb create main.py
branch (创建和查看分支)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git branch dev #创建dev分支 2 3 $ git branch #查看所有分支 4 # 输出 5 dev 6 * master # *代表当前的HEAD所在的分支
checkout(移动到其他分支)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git checkout dev 2 # 输出 3 Switched to branch 'dev' 4 5 $ git branch 6 # 输出 7 * dev # HEAD指向dev分支 8 master
checkout -b(创建并移动到新的分支)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git checkout -b dev2 2 # 输出 3 Switched to a new branch 'dev2' 4 5 $ git branch 6 # 输出 7 dev 8 * dev2 # HEAD 指向dev2 分支 9 master
merge(分支中的修改推送到master)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 """ 2 dev分支 3 2.py中添加一行代码:change3 = 'dev' 4 """ 5 $ git commit -am "change 3 in dev" #"-am":add所有改变并commit 6 # 输出 7 [dev 50e43f0] change 3 in dev 8 1 file changed, 2 insertions(+) 9 10 $ git checkout master # 切换至master 11 # 输出 12 Switched to branch 'master' 13 14 $ git merge dev # 将 dev分支 merge到 master中 15 # 输出 16 Updating 47f167e..50e43f0 17 Fast-forward # 默认fast-forward模式,不保留本次Merge的commit信息 18 2.py | 2 ++ 19 1 file changed, 2 insertions(+) 20 21 $ git log --oneline --graph #log中没有保留dev中的commit 22 # 输出 23 * 50e43f0 (HEAD -> master, dev) change 3 in dev 24 * 47f167e back to change 1 and add comment for 1.py 25 * 904e1ba change 2 26 * c6762a1 change 1 27 * 13be9a7 create 1.py 28 29 """ 30 dev2分支 31 2.py中添加一行代码:change4 = 'dev2' 32 """ 33 $ git commit -am "change 4 in dev2" 34 # 输出 35 [dev2 d6ae0fc] change 4 in dev2 36 1 file changed, 2 insertions(+), 1 deletion(-) 37 38 $ git checkout master #切换至master 39 # 输出 40 Switched to branch 'master' 41 42 $ git merge --no-ff -m "keep merge info" dev2 43 # 输出 44 Merge made by the 'recursive' strategy. #recursive模式保留分支中的commit信息 45 2.py | 3 ++- 46 1 file changed, 2 insertions(+), 1 deletion(-) 47 48 $ git log --oneline --graph 49 # 输出 50 * 85dd1ec (HEAD -> master) keep merge info 51 |\ 52 | * d6ae0fc (dev2) change 4 in dev2 #保留分支中的commit信息 53 |/ 54 * 50e43f0 (dev) change 3 in dev 55 * 47f167e back to change 1 and add comment for 1.py 56 * 904e1ba change 2 57 * c6762a1 change 1 58 * 13be9a7 create 1.py
4.2 merge(处理分支冲突)
如何处理 master 和 dev 同时修改后的 merge 冲突问题,比如:
master
中的1.py
加上# edited in master
.dev
中的1.py
加上# edited in dev
.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git checkout master 2 $ git log --oneline #master 中的log 3 # 输出 4 3d7796e (HEAD -> master) change 4 in master #与dev不同 5 47f167e back to change 1 and add comment for 1.py 6 904e1ba change 2 7 c6762a1 change 1 8 13be9a7 create 1.py 9 10 $ git checkout dev 11 $ git log --oneline #dev 中的log 12 # 输出 13 f7d2e3a (HEAD -> dev) change 3 in dev #与master不同 14 47f167e back to change 1 and add comment for 1.py 15 904e1ba change 2 16 c6762a1 change 1 17 13be9a7 create 1.py 18 19 $ git merge dev 20 # 输出 21 Auto-merging 1.py 22 CONFLICT (content): Merge conflict in 1.py 23 Automatic merge failed; fix conflicts and then commit the result.
当 merge dev 和 master 的时候,Git 发现 1.py 在 master 和 dev 中的版本不同,所以提示 merge 有冲突,具体的冲突 Git 已经在 1.py 文件中标注出来,打开文件就能看到(python自带的IDE打开)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 a = 1 2 # I went back to change 1 3 <<<<<<< HEAD 4 # edited in master 5 ======= 6 # edited in dev 7 >>>>>>> dev
此时,需要手动处理 1.py 中的冲突,将 HEAD 中的描述与 dev 中的描述合并起来
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 a = 1 2 # I went back to change 1 3 4 # edited in master and dev
commit 现在的文件即可解决冲突
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git commit -am "solve conflict" 2 # 输出 3 [master 99ebe95] solve conflict 4 5 $ git log --oneline --graph 6 # 输出 7 * 99ebe95 (HEAD -> master) solve conflict 8 |\ 9 | * f7d2e3a (dev) change 3 in dev 10 * | 3d7796e change 4 in master 11 |/ 12 * 47f167e back to change 1 and add comment for 1.py 13 * 904e1ba change 2 14 * c6762a1 change 1 15 * 13be9a7 create 1.py
4.3 rebase(处理分支冲突)
通过 rebase 使得 branch-A 的 C3 吸纳了 branch-B 的 C4 的更新,在 branch-A 与 branch-B 共享的分支中生成了新的 C3' ;
而通过 merge 方式生成的 C5 commint 仍旧在 branch-A 上面,因此只能在自己的分支中使用 rebase ,和别人共享的部分是不能使用的
如何处理 master 和 dev 同时修改后的 rebase 冲突问题,比如:
master
中的1.py
加上# edited in master
.dev
中的1.py
加上# edited in dev
.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git checkout master 2 $ git log --oneline #master 中的log 3 # 输出 4 3d7796e (HEAD -> master) change 4 in master #与dev不同 5 47f167e back to change 1 and add comment for 1.py 6 904e1ba change 2 7 c6762a1 change 1 8 13be9a7 create 1.py 9 10 $ git checkout dev 11 $ git log --oneline #dev 中的log 12 # 输出 13 f7d2e3a (HEAD -> dev) change 3 in dev #与master不同 14 47f167e back to change 1 and add comment for 1.py 15 904e1ba change 2 16 c6762a1 change 1 17 13be9a7 create 1.py 18 19 $ git merge dev 20 # 输出 21 Auto-merging 1.py 22 CONFLICT (content): Merge conflict in 1.py 23 Automatic merge failed; fix conflicts and then commit the result.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git rebase dev 2 # 输出 3 error: could not apply 3d7796e... change 4 in master 4 Resolve all conflicts manually, mark them as resolved with 5 "git add/rm <conflicted_files>", then run "git rebase --continue". 6 You can instead skip this commit: run "git rebase --skip". 7 To abort and get back to the state before "git rebase", run "git rebase --abort". 8 Could not apply 3d7796e... change 4 in master 9 Auto-merging 1.py 10 CONFLICT (content): Merge conflict in 1.py
Git 发现 1.py 在 master 和 dev 上的版本不同,因此提示 rebase 有冲突,详情打开 1.py 文件即可看到
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 a = 1 2 # I went back to change 1 3 <<<<<<< HEAD 4 # edited in dev 5 ======= 6 # edited in master 7 >>>>>>> 3d7796e (change 4 in master)
此时 HEAD 停留在 rebase 模式上
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git branch 2 # 输出 3 * (no branch, rebasing master) # HEAD在这 4 dev 5 master
接下来打开 1.py 手动合并差异
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 a = 1 2 # I went back to change 1 3 4 # edited in master and dev
rebase 现在的文件即可解决冲突,但是 master 的历史会被修改,因此千万不要在共享分支中使用 rebase
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git add 1.py 2 3 $ git rebase --continue 4 # 输出 5 Successfully rebased and updated refs/heads/master. 6 7 $ git log --oneline --graph 8 # 输出 9 * 7a70f12 (HEAD -> master) change 4 in master # 这条 commit 原本的id=3d7796e, 所以 master 的历史被修改 10 * f7d2e3a (dev) change 3 in dev # rebase 过来的dev commit 11 * 47f167e back to change 1 and add comment for 1.py 12 * 904e1ba change 2 13 * c6762a1 change 1 14 * 13be9a7 create 1.py
4.4 stash(临时修改)
通过 stash 能够将目前手里的工作放在一边分隔开来,再另外单独处理之前的任务
暂存 dev 分支的任务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git checkout dev 2 # 输出 3 Switched to branch 'dev' 4 5 """ 6 1.py中添加一行代码:# feel happy 7 """ 8 9 $ git stash 10 # 输出 11 Saved working directory and index state WIP on dev: f7d2e3a change 3 in dev 12 13 $ git status 14 # 输出 15 On branch dev 16 nothing to commit, working tree clean # 干净得很
完成 boss 分支的任务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git checkout -b boss 2 # 输出 3 Switched to a new branch 'boss' 4 5 """ 6 1.py中添加一行代码:# lovely boss 7 """ 8 9 $ git commit -am "job from boss" 10 # 输出 11 [boss 4ed34e8] job from boss 12 1 file changed, 4 insertions(+) 13 14 $ git checkout master 15 # 输出 16 Switched to branch 'master' 17 18 $ git merge --no-ff -m "merge boos job" boss 19 # 输出 20 Auto-merging 1.py 21 CONFLICT (content): Merge conflict in 1.py 22 Automatic merge failed; fix conflicts and then commit the result. 23 24 """ 25 冲突文件 26 a = 1 27 # I went back to change 1 28 <<<<<<< HEAD 29 30 # edited in master and dev 31 32 ======= 33 # edited in dev 34 35 # lovely boss 36 >>>>>>> boss 37 38 修改为 39 a = 1 40 # I went back to change 1 41 42 # edited in master and dev 43 44 # lovely boss 45 """ 46 47 $ git commit -am "solve conflict" 48 # 输出 49 [master b218671] solve conflict 50 51 $ git log --oneline --graph 52 # 输出 53 * b218671 (HEAD -> master) solve conflict 54 |\ 55 | * 4ed34e8 (boss) job from boss 56 * | 2d1961f change 4 in master 57 |/ 58 * f7d2e3a (dev) change 3 in dev 59 * 47f167e back to change 1 and add comment for 1.py 60 * 904e1ba change 2 61 * c6762a1 change 1 62 * 13be9a7 create 1.py
恢复 dev 分支的任务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git checkout dev 2 # 输出 3 Switched to branch 'dev' 4 5 $ git stash list # 查看stash 中的缓存 6 # 输出 7 stash@{0}: WIP on dev: f7d2e3a change 3 in dev #stash 中有dev 的工作 8 9 $ git stash pop # 通过pop 来提取并继续工作 10 # 输出 11 On branch dev 12 Changes not staged for commit: 13 (use "git add <file>..." to update what will be committed) 14 (use "git restore <file>..." to discard changes in working directory) 15 modified: 1.py 16 17 no changes added to commit (use "git add" and/or "git commit -a") 18 Dropped refs/stash@{0} (18f4cb0facb172080e905ce8d890bfe1baea3049) 19 20 $ git status -s 21 # 输出 22 M 1.py # 未add(显示红色)
Git指令集
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 $ git --help 2 3 # 输出 4 usage: git [--version] [--help] [-C <path>] [-c <name>=<value>] 5 [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] 6 [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare] 7 [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] 8 <command> [<args>] 9 10 These are common Git commands used in various situations: 11 12 start a working area (see also: git help tutorial) 13 clone Clone a repository into a new directory 14 init Create an empty Git repository or reinitialize an existing one 15 16 work on the current change (see also: git help everyday) 17 add Add file contents to the index 18 mv Move or rename a file, a directory, or a symlink 19 restore Restore working tree files 20 rm Remove files from the working tree and from the index 21 sparse-checkout Initialize and modify the sparse-checkout 22 23 examine the history and state (see also: git help revisions) 24 bisect Use binary search to find the commit that introduced a bug 25 diff Show changes between commits, commit and working tree, etc 26 grep Print lines matching a pattern 27 log Show commit logs 28 show Show various types of objects 29 status Show the working tree status 30 31 grow, mark and tweak your common history 32 branch List, create, or delete branches 33 commit Record changes to the repository 34 merge Join two or more development histories together 35 rebase Reapply commits on top of another base tip 36 reset Reset current HEAD to the specified state 37 switch Switch branches 38 tag Create, list, delete or verify a tag object signed with GPG 39 40 collaborate (see also: git help workflows) 41 fetch Download objects and refs from another repository 42 pull Fetch from and integrate with another repository or a local branch 43 push Update remote refs along with associated objects 44 45 'git help -a' and 'git help -g' list available subcommands and some 46 concept guides. See 'git help <command>' or 'git help <concept>' 47 to read about a specific subcommand or concept. 48 See 'git help git' for an overview of the system.
Github
Git:本地管理库
Github:在线管理库
5.1 GitHub 在线代码管理
1. 添加在线版本库 repository
2. 将本地管理库连接到在线管理库
3. 上传成功
4. 查看文件历史(commit)
5. 本地更新推送至 github
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 """ 2 1.py添加一行代码:# happy github 3 """ 4 $ git commit -am "change 5" 5 # 输出 6 [main b888fe8] change 5 7 1 file changed, 1 insertion(+) 8 9 $ git push -u origin main 10 # 输出 11 Enumerating objects: 5, done. 12 Counting objects: 100% (5/5), done. 13 Delta compression using up to 16 threads 14 Compressing objects: 100% (3/3), done. 15 Writing objects: 100% (3/3), 326 bytes | 326.00 KiB/s, done. 16 Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 17 To https://github.com/vincent-lin89/git-demo.git 18 2d1961f..b888fe8 main -> main 19 Branch 'main' set up to track remote branch 'main' from 'origin'.
参考资料
莫烦Python
https://mofanpy.com/tutorials/others/git/
官方文档
https://git-scm.com/about
XX.GIT
http://bramus.github.io/ws2-sws-course-materials/xx.git.html#/
Bitbucket
https://www.atlassian.com/git/tutorials