git(可能)冲突解决工作流程
git (possible) conflict resolution workflow
我正在尝试确定合适的 git 工作流程。有几个问题让我感到困惑。
您正在处理功能分支。一旦你做出承诺,你应该:
1) 拉取功能分支(如果您是唯一从事该工作的人,则可选)。
2) 从 master 合并(或者更好的是变基)并解决冲突(如果有的话)。
3) 结帐大师。
4) 从远程主机拉取。
5) 合并功能分支(如果一切顺利,应该会导致快进)。
6) 推送到远程。
正如我所提到的,有些事情我不太满意。
第 2 步假设 master 是最新的,不是吗?
如果不是(第 4 步实际上引入了一些更改)那又怎样?您应该返回功能分支并重复步骤 2 吗?
我不确定从何而来,但我有一个想法,即所有合并(或变基)冲突都应在功能分支中解决。那是对的吗?如果是,为什么?
如果 3 为真,那么我应该去 master,pull(以确保我有最新的 master),回到功能分支并执行 merge/rebase(也包括额外的步骤以确保 master 是最新的)?
编辑 1:
例如一个场景:
你完成了一个功能分支的工作,想把这些更改放到 master 上。您目前在本地功能分支中。自从您开始在功能分支上工作以来,本地 master 没有任何变化。但是,远程主机有变化。应该如何处理这种情况?
假设同时有不止一个人在存储库上工作,并且远程 源代码控制管理 (SCM) 是 GitHub。
您应该为您的工作创建一个 Pull Request(这也被其他 SCM 提供商称为 Merge Request)。
这应该由项目的另一名成员审查并合并。如果有冲突,它不会让你合并 PR。然后你需要在远程 SCM 上或本地解决,具体取决于 SCM 提供商。
在您必须在本地重新设置 master
基址的情况下。你有两种方法可以采用。
- 你上面提到的方法。在哪里切换分支并进行 rebase
- 您可以使用 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
时,没有任何更改可以拉取。
希望这对您的用例有所帮助。
我正在尝试确定合适的 git 工作流程。有几个问题让我感到困惑。
您正在处理功能分支。一旦你做出承诺,你应该:
1) 拉取功能分支(如果您是唯一从事该工作的人,则可选)。
2) 从 master 合并(或者更好的是变基)并解决冲突(如果有的话)。
3) 结帐大师。
4) 从远程主机拉取。
5) 合并功能分支(如果一切顺利,应该会导致快进)。
6) 推送到远程。
正如我所提到的,有些事情我不太满意。
第 2 步假设 master 是最新的,不是吗?
如果不是(第 4 步实际上引入了一些更改)那又怎样?您应该返回功能分支并重复步骤 2 吗?
我不确定从何而来,但我有一个想法,即所有合并(或变基)冲突都应在功能分支中解决。那是对的吗?如果是,为什么?
如果 3 为真,那么我应该去 master,pull(以确保我有最新的 master),回到功能分支并执行 merge/rebase(也包括额外的步骤以确保 master 是最新的)?
编辑 1:
例如一个场景:
你完成了一个功能分支的工作,想把这些更改放到 master 上。您目前在本地功能分支中。自从您开始在功能分支上工作以来,本地 master 没有任何变化。但是,远程主机有变化。应该如何处理这种情况?
假设同时有不止一个人在存储库上工作,并且远程 源代码控制管理 (SCM) 是 GitHub。 您应该为您的工作创建一个 Pull Request(这也被其他 SCM 提供商称为 Merge Request)。
这应该由项目的另一名成员审查并合并。如果有冲突,它不会让你合并 PR。然后你需要在远程 SCM 上或本地解决,具体取决于 SCM 提供商。
在您必须在本地重新设置 master
基址的情况下。你有两种方法可以采用。
- 你上面提到的方法。在哪里切换分支并进行 rebase
- 您可以使用 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
时,没有任何更改可以拉取。
希望这对您的用例有所帮助。