Git(可能)冲突解决工作流

git (possible) conflict resolution workflow

提问人:NulisDefo 提问时间:2/10/2020 最后编辑:NulisDefo 更新时间:2/11/2020 访问量:509

问:

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

您正在开发功能分支。一旦你提交了,你应该:

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

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

3)结账大师。

4) 从远程主站拉取。

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

6) 推送到遥控器。

正如我所提到的,有些事情不适合我。

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

  2. 如果不是(第 4 步实际上进行了一些更改),那又如何?是否应该返回功能分支并重复步骤 2?

  3. 我不确定从哪里来,但我有一个概念,所有合并(或变基)冲突都应该在功能分支中解决。这是对的吗?如果是这样,为什么?

  4. 如果 3 为真,那么我是否应该转到 master,拉取(以确保我有最新的 master),返回功能分支并进行合并/变基(又名包含额外步骤以确保 master 处于最新状态)?

编辑1:

例如,一个场景:

您完成了功能分支的工作,并希望将这些更改放在 master 上。您目前位于本地功能分支中。本地主服务器上没有任何变化,因为您已经开始在功能分支上工作。但是,远程主服务器有一些变化。应该如何处理这种情况?

git git-rebase git-merge-conflict

评论

1赞 Prav 2/11/2020
看看这个 datasift.github.io/gitflow/IntroducingGitFlow.html。看看这是否澄清了事情?
0赞 NulisDefo 2/11/2020
@PraveenPremaratne 谢谢,这很有用,但在我看来,该链接提供了更高层次的会谈。请看一下示例场景,其中讨论了要包含的具体步骤才能达到更高的水平。目标。
0赞 torek 2/11/2020
不同的小组选择不同的工作流程。我有一些我更喜欢的,但如果你正在与一个团队一起工作,最重要的是就工作流程达成一致并使用商定的工作流程。

答:

1赞 Prav 2/11/2020 #1

假设有多个人同时在存储库上工作,并且远程源代码管理 (SCM) 是 GitHub。 您应该为您的工作创建一个拉取请求(这在其他 SCM 提供商中也称为合并请求)。

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

如果您必须在本地重新定位。您可以采取两种方法。master

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

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

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

  • git fetch以拉动遥控器上的所有更改。这将更新存储库的索引。origin
  • git rebase origin/master.由于我们只使用 fist 命令更新了索引,因此您需要说您要从 ;因此originoriginorigin/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
  • 使用更新的索引而不是本地索引进行变基。origin/developdevelop
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

您可能注意到,当我合并 brach 时,它告诉我我的分支在 1 个提交的后面。但是,当合并在推送合并之前执行 at 时,没有要拉取的更改。developgit pull

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

评论

0赞 NulisDefo 2/19/2020
是的。这是因为那些“落后 1 次提交”的更改被应用于功能分支,然后合并到从而解决了这个问题。不过,我对你的处决有一些疑问。1) 您是否在那里进行了未暂存的更改(因为重新设置了之后)?2)那个命令是什么?我第一次看到这个。特别是,因为完整的分支名称是 .3)你不需要获取所有分支的更改(你目前不在的分支)developadd->commitgit flow feature finish rebase-testfeature/rebase-testgit fetch --all
0赞 Prav 2/26/2020
Git reabase,重放分支上缺少的所有提交,在这种情况下,分支上缺少 1 个提交。简而言之,Replay 是一个自动版本,所以这就是为什么它显示我添加了一个提交。 是特定于 GitFlow 的命令,并且以此为前缀,这就是为什么我只需要说出哪个是分支名称。那将成为. 只会获取分支,而不获取标签。获取分支和标签也是如此。在第一个上,它显示了它获取开发。release-testgit commit -mgit flow feature finishfeaturefeature/release-testfeature/release-testgit fetch--all
0赞 Prav 2/26/2020
GitFlow 命令将执行诸如合并分支时清理存储库之类的操作,如果您正在执行发布,它将使用单个命令标记发布,例如git flow release finish 0.0.0