【问题标题】: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-1origin/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.defaultstackoverflow.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
      相关资源
      最近更新 更多