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

3

我对git比较新,一开始就遇到了一些问题。我已经提交了几次,但是当我尝试推送它们时,我会收到一个响应,说一切都是最新的。我感觉我的问题与这个问题中列出的问题相同,但它推荐以下操作:

$ 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


这个问题是什么问题?你没有提供链接。 - Jimmy
2个回答

4

检出分支会移动本地 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不同,提交本身在本地处理,没有与服务器的任何交互。

我在另一篇帖子中运行了三个命令,但它仍然显示一切都是最新的。 - danwoods
也许在你之前的某次尝试中,推送已经成功了,因此它准确地报告说它是最新的。你可以发布 gitk 中历史记录的截图,这样我们就可以看到发生了什么。也许你的情况与其他问题中的情况不同。 - Jimmy
这是你第一次尝试推送吗?你的远程仓库设置正确吗?git push没有参数将只会推送到它知道如何跟踪的远程分支。 - Jimmy
根据截图显示,当你尝试推送时,git 正确地报告 origin/master 是最新的。从 gitk 中可以看出,masterorigin/master 指向相同的提交。历史记录顶部的红点表示你已经进行了更改,但是还没有提交。为了将这些更改推送到远程,它们必须先在本地提交。 - Jimmy
啊,抱歉。默认情况下是 git commit。很多人将 ci 设置为 commit 的别名,因此有时你会看到它们被交替使用。 - Jimmy
显示剩余6条评论

-1

git checkout master 是将您的工作区切换到master分支,也被其他版本控制系统称为trunk


我认为稍微详细地说明一下reset的作用是值得一提的,以回答这个问题。 - electblake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接