Git rebase 而不是合并,正确的做法是什么?

now*_*wox 2 git merge rebase

我想通过使用 arebase而不是merge.

为了让您更好地了解我想要实现的目标,请考虑以下情况:

$ git lg
* 2345678 hotfix (HEAD -> master)
* 1234567 foo (origin/master, origin/HEAD)

$ git push 
! [rejected]  master -> master (fetch first)

$ git fetch
$ git lg 
* 2345678 hotfix (HEAD -> master)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
Run Code Online (Sandbox Code Playgroud)

通常,解决此问题的标准方法是merge后跟一个push

$ git merge origin/master
$ git lg
* 4567890 Merge remote-tracking branch 'origin/master'
|\
* |  2345678 hotfix (HEAD -> master)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
$ git push
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个解决方案,因为在这种特殊情况下我可以很容易地避免分支。因此,让我们恢复更改git reset --hard head~1并尝试另一种解决方案:

$ git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: hotfix

$ git lg
* 2345678 hotfix (master)
| * 5678901 hotfix (HEAD)
| * 3456789 other change (origin/master, origin/HEAD)
|/
* 1234567 foo
Run Code Online (Sandbox Code Playgroud)

现在是令人不快的部分,我不得不放弃masterHEAD

$ git branch -D master
$ git checkout -b master
$ git push
$ git branch --set-upstram-to=origin/master master
Branch master set up to track remote branch master from origin.
$ git lg 
* 5678901 hotfix (HEAD -> master, origin/master, origin/HEAD)
* 3456789 other change
* 1234567 foo
Run Code Online (Sandbox Code Playgroud)

我的问题是如何简化rebase并避免不愉快的部分?

Kev*_*ett 5

我认为最简单的方法是改变你的拉取工作流程。这里有几个选项。

一、可以用--rebaseflag拉

git pull --rebase
Run Code Online (Sandbox Code Playgroud)

根据文档,在其默认配置中git pull执行 afetch后跟 a merge。使用该--rebase标志将替换mergerebase:)

其次,您可以设置默认值以始终执行此操作 git pull

git config --global pull.rebase true
Run Code Online (Sandbox Code Playgroud)

我会推荐第一种方法,因为设置默认的 rebase 会让我紧张。我创建了一个别名git prgit pull --rebase,使其更容易。这样我就可以在每次拉动时做出决定。