git checkout 相关命令总结
1.git checkout
表示核查工作区相对于版本库修改过的文件
2. git checkout + 分支名
表示切换分支
3. git checkout -b 分支名
表示以当前分支的当前状态创建新分支并切换到新分支 -b 表示创建新分支
4. git checkout -b 分支名 commitID
表示以当前分支的commitID提交节点创建新的分支并切换到新分支。此时工作区的内容和切换分之前commitID提交节点的内容一样
5. git checkout commitID
是以指定的提交节点创建了一个临时性分支,此临时性分支可用于做实验性修改
6.git checkout filename
当没有提交版本号时将工作区的指定文件的内容恢复到暂存区的状态
git checkout .
将工作区的所有文件的内容恢复到暂存区的状态
7. git checkout <commit> filename
当有提交版本号时,表示将工作区和暂存区都恢复到版本库指定提交版本的指定文件的状态,此时HEAD指针不变,此时的状态相当于把工作区的内容修改到指定版本的文件内容后,再把修改的内容添加到暂存区。因此git checkout <commit> filename后,可以直接执行git commit而不需要先执行git add
操作详细如下
1.git checkout 后面不加任何参数。表示核查工作区相对于版本库修改过的文件
2. git checkout + 分支名 表示切换分支
3. git checkout -b 分支名 表示以当前分支的当前状态创建新分支并切换到新分支 -b 表示创建新分支
4. git checkout -b 分支名 commitID 表示以当前分支的commitID提交节点创建新的分支并切换到新分支。此时工作区的内容和切换分之前commitID提交节点的内容一样
5. git checkout commitID 此命令有些特殊,此命令执行后,工作区的内容会变成commitID提交节点的内容,但时HEAD不位于任何分支上,处于游离状态。
更准确的说,此命令是以指定的提交节点创建了一个临时性分支,被别HEAD指向了这个临时分支,你可以在这个临时分支上修改内容并且提交内容。
但是,一但你从临时分支切换到其他分支,这个临时分支就会消失。
这种临时性分支主要用来做一些实验性的修改,实验结束后,只要切换回原分支即可,原分支不会有任何改变。临时性分支上的改动并不会反映到原分支。
但是你如果想把这临时性分支上的改动反映到原分支上,可以通过git checkout -b 新分支名 命令 以临时性分支的当前状态创建一个永久性分支,再把这个分支合并到原先的分支,然后再删除这个分支即可。
执行git checkout commitID命令
将临时性分支反映到原分支master上
w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master) $ git log --pretty=oneline 515bbaac44e128a4e3c1f956bb962359090b7dc6 (HEAD -> master, newbranch) AA cc19754ef1ea7f9e0414eed31592af952094116e (branch2, branch1) Merge branch 'tem' 065be4955a8e3e2e1d7bdf8b181f58a2066b5289 CC 5da296c5bf7d7f674f4a128d1ff77a79f4ee0311 BB da2b161d76b0fb0b07b56cc4d229f92fa9424d5a AAA a3239e33bcfb422c3f9fc72a622e50f207a7e61d add l3 22ff17b9dce0a7a2fd9f6c3760cef876e733b0a2 add test2.txt ae61384fee29e82c3975cae1a03122eb69eee31b (newbranch2) add l1 1d000b4679adca98a168328dad432a9216877442 add file w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master) $ git checkout a3239e Note: checking out 'a3239e'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at a3239e3 add l3 w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn ((a3239e3...)) $ git branch * (HEAD detached at a3239e3) branch1 branch2 master newbranch newbranch2 newbranch3 w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn ((a3239e3...)) $ git add . w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn ((a3239e3...)) $ git commit -m "add l4" [detached HEAD 3cfcff2] add l4 1 file changed, 2 insertions(+), 1 deletion(-) w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn ((3cfcff2...)) $ git checkout -b newbranch4 Switched to a new branch 'newbranch4' w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (newbranch4) $ git log --pretty=online fatal: invalid --pretty format: online w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (newbranch4) $ git log --pretty=oneline 3cfcff2024cfd555dffe9fcdffd6d0ded4c4b43f (HEAD -> newbranch4) add l4 a3239e33bcfb422c3f9fc72a622e50f207a7e61d add l3 22ff17b9dce0a7a2fd9f6c3760cef876e733b0a2 add test2.txt ae61384fee29e82c3975cae1a03122eb69eee31b (newbranch2) add l1 1d000b4679adca98a168328dad432a9216877442 add file w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (newbranch4) $ git branch branch1 branch2 master newbranch newbranch2 newbranch3 * newbranch4 w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (newbranch4) $ git checkout master Switched to branch 'master' w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master) $ git merge newbranch4 Auto-merging test1.txt CONFLICT (content): Merge conflict in test1.txt Automatic merge failed; fix conflicts and then commit the result. w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master|MERGING) $ git add . w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master|MERGING) $ git commit [master b13df65] Merge branch 'newbranch4' w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master) $ git branch -d newbranch4 Deleted branch newbranch4 (was 3cfcff2). w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master) $ git branch branch1 branch2 * master newbranch newbranch2 newbranch3
当从临时性分支切换到其他分支后,如果还想保存临时性分支的内容,那么可以通过以下命令创建一个新分支来保存临时性分支的内容
w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn ((5f43910...)) $ git branch * (HEAD detached from a3239e3) branch1 branch2 master newbranch newbranch2 newbranch3 w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn ((5f43910...)) $ git checkout master Warning: you are leaving 1 commit behind, not connected to any of your branches: 5f43910 add l4 l5 If you want to keep it by creating a new branch, this may be a good time to do so with: git branch <new-branch-name> 5f43910 Switched to branch 'master' w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master) $ git branch newbanch5 5f43910 w_gao@YRL47-80972 MINGW64 /c/w_gao/git learn (master) $ git branch branch1 branch2 * master newbanch5 newbranch newbranch2 newbranch3
6.git checkout filename 当没有提交版本号时将工作区的内容恢复到暂存区的状态
7. git checkout <commit> filename 当有提交版本号时,表示将工作区和暂存区都恢复到版本库指定提交版本的指定文件的状态,此时HEAD指针不变,此时的状态相当于把工作区的内容修改到指定版本的文件内容后,再把修改的内容添加到暂存区。因此git checkout <commit> --filename后,可以直接执行git commit而不需要先执行git add