如何解决`git checkout <branch-name>`带给我一个过时的提交的问题?

时间:2017-06-28 00:07:44

标签: git github

我在12天前做了git clone,然后从那时起,我已经从上游(我的仓库从GitHub分叉)更新或添加了一个分支foo

但是在那个旧目录中,我甚至无法改变那个分支。

然后,我做了

git fetch --all
git checkout -b some-branch-name   # the  -b  is important or else it 
                                   #   thinks some-branch-name is a filename

并可以切换到该分支。但是当我git log时,我看到的是12天前的最新提交。

如何使其成为现实?如果我再次从GitHub和git clone再次git checkout <some-branch-name>,那么我git log并且会看到今天提交的提交而不是12天。

但是我不想使用npm i等等再次设置所有内容,所以我希望旧目录能够看到当前的分支内容。

2 个答案:

答案 0 :(得分:0)

分支名称会记住您的一些特定提交。标签名称做同样的事情。两者(分支名称与标记名称)之间的区别在于Git和Git用户需要分支名称移动到较新的提交。

在您的情况下,您只需运行:

  • git fetchgit fetch originorigin部分是远程的名称,主要是URL的简称。这告诉你的Git调用另一个Git - 你从最初克隆的Git - 并引入你还没有的新提交。它会记住其他 Git的分支在哪里,使用远程跟踪分支名称。因此,如果他们有一个名为master的分支,则会得到一个名为origin/master的分支,它会记住他们的Git master在最后git fetch的位置。

  • 远程跟踪分支名称上的
  • git log:例如git log origin/master,以便在您更新origin/master后查看origin/master中的内容来自其他Git的master

  • git mergegit rebase:这些与您的提交合并或重新绑定(复制)到其他某个分支,例如远程跟踪分支。

如果您创建 new 分支(就像使用git checkout -b一样),则此新分支可能没有上游设置。您可以选择一个(且仅一个)远程跟踪分支设置为其上游。例如,如果您的新分支some-branch-name应该有origin/master作为其上游:

git branch --set-upstream-to=origin/master some-branch-name

设置完成后,您的Git知道当您在some-branch-name分支上时,普通git mergegit rebase应该使用您的origin/master进行合并或者变基。

一旦你知道这一切是如何工作的,你可以使用git fetch便利命令组合git pull命令和第二个(合并或重新命名)命令。我建议推迟这一点,直到您熟悉各个命令。有时,第二个命令(git pull为您运行的两个命令)失败。当此命令失败时,您需要知道正在运行的命令。如果您只知道git pull,那么您将无法知道您正在运行的第二个命令!

答案 1 :(得分:0)

git checkout -b some-branch-namesome-branch-name创建一个新分支HEAD,然后检出新分支。如果HEAD指向12天前的提交,则新分支也指向此旧提交。

如果远程仓库中的分支(在您的情况下是分支)自上次克隆以来已更新。您可以更新本地相应的分支:

git checkout <branch-name>
git fetch origin <branch-name>
git merge FETCH_HEAD
#Or use rebase. It depends on your workflow and strategy.
git rebase FETCH_HEAD

默认情况下,fetch-merge相当于git pull origin <branch-name>fetch-rebase相当于git pull --rebase origin <branch-name>

如果没有上游分支则无关紧要。如果本地分支还没有本地新提交,或者它有,但您认为它们可以被放弃,git reset FETCH_HEAD --hard也可以。