git(可能)冲突解决工作流程

git (possible) conflict resolution workflow

我正在尝试确定合适的 git 工作流程。有几个问题让我感到困惑。

您正在处理功能分支。一旦你做出承诺,你应该:

1) 拉取功能分支(如果您是唯一从事该工作的人,则可选)。

2) 从 master 合并(或者更好的是变基)并解决冲突(如果有的话)。

3) 结帐大师。

4) 从远程主机拉取。

5) 合并功能分支(如果一切顺利,应该会导致快进)。

6) 推送到远程。

正如我所提到的,有些事情我不太满意。

  1. 第 2 步假设 master 是最新的,不是吗?

  2. 如果不是(第 4 步实际上引入了一些更改)那又怎样?您应该返回功能分支并重复步骤 2 吗?

  3. 我不确定从何而来,但我有一个想法,即所有合并(或变基)冲突都应在功能分支中解决。那是对的吗?如果是,为什么?

  4. 如果 3 为真,那么我应该去 master,pull(以确保我有最新的 master),回到功能分支并执行 merge/rebase(也包括额外的步骤以确保 master 是最新的)?

编辑 1:

例如一个场景:

你完成了一个功能分支的工作,想把这些更改放到 master 上。您目前在本地功能分支中。自从您开始在功能分支上工作以来,本地 master 没有任何变化。但是,远程主机有变化。应该如何处理这种情况?

假设同时有不止一个人在存储库上工作,并且远程 源代码控制管理 (SCM) 是 GitHub。 您应该为您的工作创建一个 Pull Request(这也被其他 SCM 提供商称为 Merge Request)。

这应该由项目的另一名成员审查并合并。如果有冲突,它不会让你合并 PR。然后你需要在远程 SCM 上或本地解决,具体取决于 SCM 提供商。

在您必须在本地重新设置 master 基址的情况下。你有两种方法可以采用。

  1. 你上面提到的方法。在哪里切换分支并进行 rebase
  2. 您可以使用 Git 的 git fetch 功能来拉取远程上存在的所有分支。

使用第二种方法可以避免切换分支,但仍然具有与第一种方法相同的效果。

使用第二种方法,您需要 运行:

  • git fetch 拉取远程上的所有更改。这将更新存储库的 origin 索引。
  • git rebase origin/master。因为我们只用 fist 命令更新了 origin 索引,你需要说你想从 origin 的 master 分支变基;因此 origin/master

Here's an example

这里develop是你的master

  • 更新 origin 索引以匹配远程
users:() ➜  (10/02 22:52) ~/dummy git:(feature/rebase-test) ✗ git fetch
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:praveenprem/dummy
   5029e07..429a6e6  develop    -> origin/develop
  • Rebase 使用更新的 origin/develop 索引而不是本地索引 develop
users:() ➜  (10/02 22:52) ~/dummy git:(feature/rebase-test) ✗ git rebase origin/develop
First, rewinding head to replay your work on top of it...
Fast-forwarded feature/rebase-test to origin/develop.
users:() ➜  (10/02 22:53) ~/dummy git:(feature/rebase-test) ✗ git add .
users:() ➜  (10/02 22:53) ~/dummy git:(feature/rebase-test) ✗ git commit
[feature/rebase-test 9cb6ad0] Add test file 3
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test-3.txt

users:() ➜  (10/02 22:54) ~/dummy git:(feature/rebase-test) git flow feature finish rebase-test
Switched to branch 'develop'
Your branch is behind 'origin/develop' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)
Merge made by the 'recursive' strategy.
 test-2.txt | 1 +
 test-3.txt | 0
 2 files changed, 1 insertion(+)
 create mode 100644 test-2.txt
 create mode 100644 test-3.txt
Deleted branch feature/rebase-test (was 9cb6ad0).

Summary of actions:
- The feature branch 'feature/rebase-test' was merged into 'develop'
- Feature branch 'feature/rebase-test' has been removed
- You are now on branch 'develop'

users:() ➜  (10/02 22:54) ~/dummy git:(develop) git pull
Already up to date.

users:() ➜  (10/02 22:55) ~/dummy git:(develop) git push
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 1.77 KiB | 452.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:praveenprem/dummy.git
   429a6e6..ae38b95  develop -> develop

您可能注意到,当我合并分支时,它告诉我我的 develop 分支落后于 1 次提交。但是当合并在推送合并之前做了一个 git pull 时,没有任何更改可以拉取。

希望这对您的用例有所帮助。