5

我有点苦恼。

几个月前,我开始在 repo 的一个分支上进行开发。我做了一些改变。我正准备将我的代码作为拉取请求推送回主服务器,但我意识到在此期间有很多变化......

因此,按照 Github 上“拉入上游更改”下的说明,我尝试了:

$ git remote add upstream ...  # savon/httpi
$ git fetch upstream
$ git merge upstream/master
$ git push origin/master       # coldnebo/httpi

但是,现在我的叉子很乱。我仍然是 git 的新手,所以我不会试图猜测术语是什么,而是简单地告诉你我得到了什么以及我的期望:

这是我想要的差异。有什么方法可以重新设置/还原并执行此操作而不会丢失我的更改?

真是一团糟。

也许git pull会更好?

它的变化并不多,所以如果它无法恢复,我总是可以手动区分并重新制作它,但我正在寻找“正确的方法”来做这件事。

4

3 回答 3

6

您应该始终为您创建的每个拉取请求创建新分支。在将其推送到 github 以创建请求之前,您应该将分支重新设置为最新的上游分支。

Github 说你用这个,如果没有太多变化git merge我更喜欢使用,这将防止合并提交git rebase upstream/master


有时变基无法继续,因为您更改的内容已在上游分支中更改。例如,假设您有一个text.txt类似的文件:

Lorem ipsum

您创建了一个 PR 来更新它,Lorem ipsum!并且上游分支已经将它更改为Hello World如果您执行 rebase,以在创建请求之前使您的代码保持最新,您会遇到合并冲突。该文件使用冲突标记进行更新,您可以选择要使用的版本,甚至可以编辑它,在我们的示例中,我们得到了这个text.txt

<<<<<<< YOUR_PR_BRANCH
Lorem Ipsum
=======
Hello World
>>>>>>> THE_UPSTREAM_BRANCH

在此之后,添加更新的文件git add并执行git rebase --continue.

于 2013-01-07T16:17:30.770 回答
6

好的,如果您的回购是 fubar,那么这里是恢复的步骤:

$ git remote update     # make sure origin and upstream are up to date
$ git checkout master
$ git branch my_changes   # just to make sure my stuff isn't lost
$ git reset --hard upstream/master
$ git status
# On branch master
# Your branch is behind 'origin/master' by 8 commits, and can be fast-forwarded.
#

忽略那个快进废话,它对你没有帮助,只需重置主人。

$ git push origin +master   # now, fork matches upstream/master

现在,如何恢复以前的工作,使其可审查?

$ git diff --no-ext-diff --no-prefix master..my_changes > patchfile
$ patch -p0 < patchfile   # apply the patchfile to master
$ git diff     # to verify patch visually.
$ rm patchfile   # clean up
$ rake spec      # verify that it really works.
$ git add .
$ git status     # double triple verify
$ git commit .
$ git push origin master

那糟透了。我尝试做rebase,但它一直说“没有变化”并且没有要求我检查任何东西?我很确定我不明白这里发生了什么,这就是为什么我发布了我的斗争,以便有人可以解释我如何避免这种混乱并更优雅地从 A 到 B ,因为它已被完整记录。我愿意将此归咎于 git 缺乏经验,但我认为拉动更改应该是 git 中非常普遍的事情——我一定遗漏了一些东西。

于 2013-01-10T16:47:41.527 回答
1

git pull --rebase为我工作并保持历史整洁。

于 2013-01-07T16:32:25.680 回答