【问题标题】:Can someone clarify the git workflow where there's a branch on the remote?有人可以澄清远程有分支的 git 工作流程吗?
【发布时间】:2021-08-23 16:29:24
【问题描述】:

我使用源树。

我平时的工作流程是:

  1. 从 origin/main 获取所有更改并将其拉入我的本地
  2. 创建本地分支 - branch-1
  3. 做开发工作
  4. 提交
  5. pull (w/rebase from origin/main)
  6. 推送到origin/branch-1
  7. 提交 PR 将origin/branch-1 合并到origin/main

但是,如果 PR 被拒绝,我需要做进一步的更改,应该如何处理?

我目前做的和上面一样,停留在local/branch-1 然后从 3 重新开始,除了 sourcetree 似乎让我想从origin/branch-1(在第 5 阶段)而不是origin/main 拉。我不确定这是否完全正确?或者我应该从origin/branch-1 和origin/main 或其他什么地方拉出来?

谢谢。

【问题讨论】:

    标签: git git-branch git-flow


    【解决方案1】:

    我会将第 5 步 (git pull) 替换为:

    # Retrieve work done on other branches without applying it, especially it updates your origin/main
    git fetch
    # Rebase your work on top of origin/main
    git rebase origin/main
    

    使用pull通常将数据从远程拉到同一个分支。

    【讨论】:

    • 这与第 5 步中使用的 git pull --rebase origin/main 有何不同?
    • OP 说 sourcetree 似乎让我想从 origin/branch-1 中提取 因此我猜这不是第 5 步中使用的命令,或者由于某种原因它混淆了 SourceTree
    • @GaëlJ 这只是 OP 无法理解 SourceTree 接口。
    【解决方案2】:

    我实际上会跳过使用 origin/main 的本地等效项,而是使用 origin/main 作为我的上游分支:

    git checkout -b my-feature1 origin/main
    

    然后,如果我以后需要从上游拉取更改:

    git pull -r
    

    当你想推入远程分支时:

    git push origin my-feature1
    

    但这显然不是一个非常流行的工作流程。

    【讨论】:

    • 这很容易将不需要的更改直接推送到 origin/main。集成更改的其余工作流程是什么?
    • 不是很容易 因为如果你只尝试运行git push git 会抱怨你的本地分支和上游分支的名称不一样,它不会推送,实际上……但最好解释一下应该在远程功能分支上进行推送。让我添加它。
    • 这与我的经验/理解不符。你有git will complain that the name of your local branch and the upstream branch are not the same and it won't push的参考吗?刚才的尝试不是我观察到的,我从 myfeature1(到 origin/main)畅通无阻 git pushIng。
    • @AD7six 这肯定是您在第一次推送时指定的问题?如果你 git push -u origin my-feature1 建立了跟踪,现在 git push 做正确的事。
    • 其实发帖前我也试过。 fatal: The upstream branch of your current branch does not match the name of your current branch. To push to the upstream branch on the remote, use.... etc etc。它还要求在git help.config 中检查push.default。 stackoverflow.com/questions/24864700/…
    【解决方案3】:

    如果 PR 被拒绝,我需要做进一步的更改,应该如何处理?

    留在你的功能分支上。编辑、添加、提交并再次推送到功能分支的远程跟踪分支。完毕。新的提交会自动添加到拉取请求中。

    因此,例如,在myfeature 上(假设其上游已配置为origin/myfeature,并且有一个拉取请求待处理):

    echo hello > test.txt
    git add test.txt; git commit -mtesting
    git push
    

    如果您随后在浏览器中转到拉取请求,您会看到此提交已按良好顺序附加到拉取请求中。


    其他cmets:

    从 origin/main 获取所有更改并将其拉入我的本地

    这可能是不必要的。您可以直接在origin/main 上获取并启动您的功能分支。但是,当您这样做时,您可能想说--no-track,以免误跟踪origin/main。例如:

    git fetch
    git switch --no-track -c myfeature origin/main
    

    从更新的main 开始创建分支myfeature。

    pull (w/ rebase from origin/main)

    这是不必要的。同样,您可以获取然后将您的功能分支重新定位到origin/main,但是一旦您推送了这可能是一个坏主意,因为您现在将推送重写的历史;而且可能没有必要。

    如果从远程更新的原因是您担心冲突,或者如果您想结合main 的最新状态来测试您的功能,最好获取然后将origin/main 合并到推送之前的功能分支。

    例如,在myfeature:

    git fetch
    git merge origin/main 
    

    无论哪种方式,都无需离开您的功能分支,也无需说 pull 。

    sourcetree 似乎让我想从 origin/branch-1(在第 5 阶段)而不是 origin/main 中提取

    不,您可以从 Sourcetree 中的任何远程分支中提取。打开左侧的 Remotes 类别,按住 Control 键单击一个分支,然后选择“Pull from...”。但是,我强烈建议不要使用 pull。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多