git rebase的正确方法

时间:2011-08-23 15:22:21

标签: git rebase

为了制作一个正常的rebase我做

$ git checkout branchA
$ git rebase master 
$ git checkout master 
$ git merge branchA

确定。

我的问题是来自其他仓库的我的分叉,我添加了三个提交,当我做

git pull --rebase otherRepo master 

获取otherRepo提交,我的提交转到日志的HEAD,但是当我尝试推送时

 ! [rejected]        HEAD -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:juanpabloaj/homebrew.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

 $ git push --force 

我可以将我的提交推送到我的远程仓库,但每次拉动都是同样的事情,
这是正确的方法吗?

3 个答案:

答案 0 :(得分:1)

git fetch otherRepo master
gitk --all

执行此操作,您将能够看到otherRepo / master的确切状态。这将帮助您弄清楚发生了什么。 git fetch更新其他资源/主人的视图(以便您可以查看其最新状态),但不会将其与任何内容合并。

答案 1 :(得分:1)

你的问题在这里:

git pull --rebase otherRepo master 

当您使用git pull --rebase时,您在master上的本地提交将在其他Repo主服务器的新提交之上重播。因此,当您向原点推送时,这将成为非快进推送(请参阅here以解释快进合并)。所以git默认不允许这样做。

解决方案很简单,从otherRepo中提取时不要将--rebasegit pull一起使用:

git pull otherRepo master

答案 2 :(得分:0)

如果你从一个回购中拉出来,那么立即尝试推送,并且它以“非快进”失败,然后其他东西正在进行。也许其他人推动了提交,或者也许你没有拉/推你认为自己的想法。通过强迫推进,你正在摧毁历史,除非你完全清楚自己在做什么,否则你可能会在没有意识到的情况下失去工作。