我做了一个仓库的git克隆,然后开发了git checkout 然后,我创建了一个功能分支,进行了一些更改,将其提交并推回到github。然后,在github中,我随后发出了一个拉取请求以将其拉出进行开发,并合并以进行开发。如果我转到github网站,然后选择development分支,那么我会在源代码中看到我的更改。
但是我找不到将新的develop分支恢复到我的mac上的方法。
如果我执行git fetch,则不会出错。然后我进行git checkout开发,但是我只看到我的旧代码。显然,我没有对机器上的任何开发进行更改,它们仅通过pull request / merge发生在github内部。
如何获得新的开发分支?
我猜到了“ git merge development”,尽管这似乎是错误的,没有任何内容可以合并,我只想从获取的更新中签出开发。 “ git mergedevelop”只是说“已经更新”,尽管事实并非如此。
我也尝试过进行git pull。这会给出错误消息,并建议:
git分支--set-upstream-to = origin /开发
这似乎太过激烈了,我不知道这样做会有什么副作用。
很显然,我可以删除整个项目,并从头开始克隆,但是我想有一种更简单的方法吗?
仅供参考,在服务器上,我尝试进行git clone,然后进行git checkout开发,然后看到了新代码。
另外,在我的Mac上,如果我执行“ git status”,则显示:
在分支机构发展中, 没什么要提交的,正在工作的树干净
还请注意,我不是用叉子工作,而是直接在主要(也是唯一的)github存储库上做分支。
答案 0 :(得分:1)
您应该这样做:
git checkout develop
git pull
那会获取并合并。
在当前情况下,您仍然可以执行以下操作:
git checkout develop
git fetch
git merge origin/develop
答案 1 :(得分:0)
您可以删除自己的develop
,然后再次git checkout develop
,或者(至少有时/通常)执行以下操作:
$ git fetch # if needed
$ git checkout develop
$ git merge
但是,实际上,您甚至不需要自己的develop
。
一旦您了解了Git中的分支 names 仅仅是指针,一切就变得清晰了。在Git中,真正重要的是 commits 。每个名称(无论是develop
或master
之类的分支名称,还是origin/develop
之类的远程跟踪名称)都仅指向一个提交。提交代表实质;名称就是Git 查找提交的方式。
让我们看一下开始时所拥有的内容,但让我们从绘制提交开始。每个提交的真实名称都有一个丑陋的哈希ID,但这对于普通人来说太笨拙了,因此让我们使用单个大写字母来表示提交。我们还要注意,每个提交都记录其 parent 提交的哈希ID。当某个东西拥有提交的哈希ID时,我们说这个东西指向。因此,如果首先提交A
,然后记住B
的哈希ID,则A
指向B
:
A
,依此类推。因为新的提交链接到旧的提交(而不是旧的链接到新的),并且一旦提交后就无法在提交内进行更改,因此这些箭头始终指向后方,因此我们可以绘制它们为方便起见。
由于哈希ID似乎是随机的,因此Git和您都需要某种名称来保存 last 提交的哈希ID:
A <--B <--C
多个名称可以拥有相同的哈希ID,就像现在运行A--B--C <-- origin/develop
那样,它会发现您没有 git checkout develop
,但是您确实有一个develop
,所以它现在{em>创建您的origin/develop
:
develop
(Git在一个分支上附加了A--B--C <-- develop (HEAD), origin/develop
一词,以记住哪个分支是当前活动的分支。将其包括在图形中是个好主意。)
如果您现在创建功能分支HEAD
,则Git也会指向提交feature
:
C
当您提交 new 提交时,Git会创建指向当前提交的新提交-提交A--B--C <-- develop, feature (HEAD), origin/develop
,通过C
找到该提交,然后更新当前名称,通过HEAD
找到,因此它指向指向HEAD
的 new 提交:
C
您现在A--B--C <-- develop, origin/develop
\
D <-- feature (HEAD)
到GitHub,它在另一个Git上创建了一个名为git push feature
的分支,您的Git调用了feature
,所以现在 you 具有: / p>
origin
请注意,您的Git只是通过这些A--B--C <-- develop, origin/develop
\
D <-- feature (HEAD), origin/feature
名称来记住他们的 Git的分支在哪里。
现在有人将您的提交合并到原始位置的origin/
中。结果是-嗯,可能是 ,具体取决于该“某人”在GitHub上的操作方式-绘制如下:
develop
如果您现在A--B--C <-- develop
\
D <-- feature (HEAD), origin/develop, origin/feature
将git checkout develop
附加到HEAD
,您将得到:
develop
如果您现在要求Git将A--B--C <-- develop (HEAD)
\
D <-- feature, origin/develop, origin/feature
与develop
合并,您的Git会注意到,它可以作为一种快进操作(实际上不是合并)来执行此操作,它会产生: / p>
origin/develop
但是请注意,如果您只是删除名称A--B--C
\
D <-- develop (HEAD), feature, origin/develop, origin/feature
,而没有附加develop
,则会得到:
HEAD
从某种意义上讲也是一样。如果现在要创建A--B--C
\
D <-- feature (HEAD), origin/develop, origin/feature
,则可以立即创建该分支名称,然后删除feature2
和feature
,并输入:
git push --delete origin feature
请注意 commits 如何始终保持违规状态。提交是Git存在的原因。分支和远程跟踪名称始终为 change 。分支名称尤其因您进行新提交而改变。当您成功A--B--C
\
D <-- feature2 (HEAD), origin/develop
时,您的远程跟踪名称就会更改—您的Git知道其Git已将新的提交接受到其分支名称中—以及当您git push
时,因为您的Git刚获取了所有最新提交,并且知道他们的分支名称现在在哪里。这些是移动的部分。提交不会动:它们只是随着时间的推移而积累。