我在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
等等再次设置所有内容,所以我希望旧目录能够看到当前的分支内容。
答案 0 :(得分:0)
分支名称会记住您的一些特定提交。标签名称做同样的事情。两者(分支名称与标记名称)之间的区别在于Git和Git用户需要将分支名称移动到较新的提交。
在您的情况下,您只需运行:
git fetch
或git fetch origin
:origin
部分是远程的名称,主要是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 merge
或git 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 merge
或git rebase
应该使用您的origin/master
进行合并或者变基。
一旦你知道这一切是如何工作的,你可以使用git fetch
便利命令组合git pull
命令和第二个(合并或重新命名)命令。我建议推迟这一点,直到您熟悉各个命令。有时,第二个命令(git pull
为您运行的两个命令)失败。当此命令失败时,您需要知道正在运行的命令。如果您只知道git pull
,那么您将无法知道您正在运行的第二个命令!
答案 1 :(得分:0)
git checkout -b some-branch-name
从some-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
也可以。