检出分支会移动本地 HEAD
指针,使其指向与该分支引用相同的提交。例如:
当在分支 mybranch
上时(C
表示提交):
HEAD
|
V
master mybranch
| |
V V
C1 -------> C2 -------> C3
运行
git checkout master
之后:
HEAD
|
V
master mybranch
| |
V V
C1 -------> C2 -------> C3
这也会根据需要移动您工作目录中的文件,使其成为该提交时项目外观的完美快照。它不会删除或更改提交,因此在检出另一个分支时,您不会丢失一条分支中的工作。
在“detached head”的情况下发生了什么,如其他问题所述,即C3未与任何分支相关联。要解决此问题,您需要更新master分支指向的提交,以便包括新内容(C3)。检出主分支告诉git您现在正在使用主分支,然后使用要处于主分支顶部的commit的SHA1进行硬重置,将分支引用更新为所需内容。
编辑:
在这种情况下,分离的头不是问题。只需记住,在git中,提交和推送是两个不同的事情。提交不像Subversion那样与中央存储库通信。在对工作目录进行更改后,您需要为每个更改的文件运行git add filename一次,其中filename是文件名。添加所有文件到索引后,您可以使用git commit将它们提交。
这个过程的简写是使用git commit -a,它会自动将修改的文件添加到索引中,然后提交。这允许您跳过git add步骤。请注意,git commit -a仅添加已修改的文件。如果您正在引入从未提交过的新文件,则必须手动添加它们。
提交后,您可以运行git push将该提交发送到远程存储库并更新远程分支。这仅涉及远程通信。与Subversion不同,提交本身在本地处理,没有与服务器的任何交互。