什么会git checkout master + git reset - hard吗?

时间:2010-03-11 00:24:02

标签: git branch

我对git相对较新,并且在早期遇到一些问题。我做了几次提交,但是当我尝试推送它们时,我得到一个回复​​,说明一切都是最新的。我觉得我的问题与this question中列出的问题相同,但建议如下:

$ git log -1
# note the SHA-1 of latest commit
$ git checkout master
# reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

“检查主人”究竟会做什么?我只是不想失去我所做的改变......

gitk的截图:
enter image description here

2 个答案:

答案 0 :(得分:4)

检出分支会移动本地HEAD指针,使其指向分支引用的同一提交。例如:

当在分支mybranch上时(C s是提交):

                        HEAD
                        |
                        V
            master      mybranch
            |           |
            V           V
C1 -------> C2 -------> C3

运行git checkout master后:

            HEAD
            |
            V
            master      mybranch
            |           |
            V           V
C1 -------> C2 -------> C3

这也会根据需要移动工作目录中的文件,这样就可以很好地了解项目在该提交时的样子。它不会删除或更改提交,因此您不会通过签出另一个分支来丢失一个分支中的工作。

在另一个问题中描述的“分离头”的情况下发生的事情是C3与分支无关。为了解决这个问题,您需要更新master分支指向的提交,以便它包含新内容(C3)。签出master告诉git你现在正在使用master分支,然后使用你想要的提交的SHA1做一个很难的reset。您的master分支更新了您想要的分支引用。

修改

在这种情况下,分离头不是问题。请记住,在git中提交和推送是两个不同的东西。提交不像Subversion中那样与中央存储库通信。对工作目录进行更改后,对每个已更改的文件运行git add filename一次,其中filename是文件的名称。将所有文件添加到索引后,您可以使用git commit提交它们。

这方面的简写是使用git commit -a,它会在提交之前自动将修改后的文件添加到索引中。这允许您跳过git add步骤。请注意,git commit -a只会添加已修改的文件。如果您要引入一个从未提交过的新文件,则必须使用git add手动添加该文件。

完成提交后,您可以运行git push将该提交发送到远程存储库并更新远程分支。这只是远程通信的东西。与Subversion不同,提交本身是在本地处理的,不需要与服务器进行任何交互。

答案 1 :(得分:-1)

git checkout master是将您的工作区域切换为 分支,也称为 主干 在其他版本控制系统中。