【问题标题】:Git - Rename a local branch which has 2 commits pushed to remoteGit - 重命名有 2 个提交推送到远程的本地分支
【发布时间】:2020-02-05 04:33:55
【问题描述】:

我有一个跟踪远程分支的分支,我做了 2 次提交,这些提交已被推送到远程分支,但尚未 PR 并合并到 master。

我现在需要重命名我的本地分支,将其推送到远程,然后 PR 并将该分支合并到 master。

这个工作流程是否正确?在此先感谢...对 Git 的大部分内容还比较陌生,所以我很感激任何意见。

  1. 在本地分支上取消设置上游分支
  2. 重命名本地分支
  3. 将本地分支推送到远程
  4. 创建 PR 以将新分支合并到 master

【问题讨论】:

  • 是的,这是可能的。之后您可能希望删除远程存储库中的分支。
  • 谢谢@Donat。感谢您的反馈。

标签: git git-branch branching-and-merging


【解决方案1】:

我发现这里的答案有点偏离目标,或者有些稀疏,所以我想我会跟踪一个分支重命名并提供一个完整的答案。该解决方案完全在本地命令行上执行。

所以,根据OP,如果本地分支被推送到origin,但尚未合并,仍然可以重命名,并且远程分支被删除,因此可以将本地分支推送到新分支下替换它名字。

假设要重命名的分支是feature/old_name,新名称是feature/new_name

首先检查你在哪里。有时我认为我仍然在某个特定的分支上,但实际上我不在,或者我忘记了我应该在一个特定的分支上进行操作,所以最好只检查你在哪里:

$ git status
# On branch feature/old_name
nothing to commit, working directory clean

列出所有可用的分支,只是为了定位:

$ git branch
  feature/some_name
* feature/old_name
  master

如果您不在要重命名的分支上,请确保您是:

$ git checkout feature/old_name
Already on 'feature/old_name'

然后只需使用 -m 选项重命名本地分支。对于本地分支,就这么简单:

$ git branch -m feature/new_name

现在要检查远程跟踪,发出一个“非常详细”的分支请求,然后观察刚刚重命名的分支仍在使用它的旧名称在远程跟踪:

$ git branch -vv
  feature/some_name fc0ec55 [origin/feature/some_name] Some commit message
* feature/new_name  a64af75 [origin/feature/old_name] Previous commit message
  master            3a0c732 [origin/master] Another commit message

所以现在有必要完全删除旧名称的远程跟踪分支。新名称的分支仍然签出:

$ git status
# On branch feature/new_name
nothing to commit, working directory clean

$ git push origin --delete feature/old_name
 - [deleted]         feature/old_name

如果您检查您的在线 Web GUI(GitLab、GitHub、BitBucket...),您应该会发现 old_name 远程分支,并且它的提交已经消失。 但是现在看本地,本地跟踪实际上并不知道远程分支已经走了:

$ git branch -vv
  feature/some_name fc0ec55 [origin/feature/some_name] Some commit message
* feature/new_name  a64af75 [origin/feature/old_name] Previous commit message
  master            3a0c732 [origin/master] Another commit message

因此,为了实现这一切,请将本地分支推送到原点,并使用其新名称:

$ git push -u origin feature/new_name
Counting objects: 21, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 2.46 KiB | 0 bytes/s, done.
Total 14 (delta 11), reused 0 (delta 0)
remote: Create pull request for feature/new_name:
 * [new branch]      feature/new_name -> feature/new_name
Branch feature/new_name set up to track remote branch feature/new_name from origin.

并确认:

$ git status
# On branch feature/new_name
nothing to commit, working directory clean

$ git branch -vv
  feature/some_name fc0ec55 [origin/feature/some_name] Some commit message
* feature/new_name  a64af75 [origin/feature/new_name] Previous commit message
  master            3a0c732 [origin/master] Another commit message

该分支现在应该可以在您的遥控器上以新名称使用。

我还没有测试过其他人也将提交推送到远程分支的场景,但只要您在执行此序列之前pull 分支,我相信这也应该有效。

如果您有疑问(git 有时就是这样),您始终可以先压缩您的本地存储库,并将其放在某个地方,这样您至少可以在本地恢复,即使通过复制如有必要,将旧文件保存到 repo ;-)

【讨论】:

    【解决方案2】:

    (一般来说,你不必太担心分支的名称)

    您可以创建一个新分支并删除旧分支。

    1. git checkout this_name_was_right_and_the_time
    2. git checkout -b feature/this_name_is_definitely right
    3. git push
    4. 从新分支创建 PR
    5. 删除旧分支

    【讨论】:

      【解决方案3】:

      嗨,伙计,我希望你了解我的工作流程。 首先,我们必须重置主人。只是让你没有其他人合并一些东西,这会让你更难。

      1. checkout master 并拉取当前的“状态”
      $ git checkout master
      $ git pull
      $ git log
      
      1. 在您的 2 次合并提交后复制提交 ID
      2. 重置主机(确定你在做什么!)
      $ git reset --hard <commit-id-that-you-copied>
      
      1. 查看本地主日志
      git log
      
      1. 删除您的远程分支(已合并)并重命名您的本地分支,然后再次推送它
      $ git push <remote_name> :<branch_name>
      (e.x. git push origin:your_local_branch
      
      1. 重命名本地分支
      $ git branch -m <your_new_name>
      
      1. 向上游推送新分支并创建 PR
      git branch --set-upstream-to=origin/your_new_name
      

      这是最简单的方法,但要确定你在做什么。

      【讨论】:

      • OP 说他们的分支没有合并。重置master 对于这个问题来说可能有点过分了。很高兴看到这些步骤被填写了一点,例如在发出reset 之前要清楚checkout master,并且通常在发出命令时要清楚你在哪个分支上。
      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 2013-08-01
      • 1970-01-01
      • 2013-04-10
      • 2016-10-25
      • 2015-07-24
      • 2013-06-10
      • 2017-02-24
      相关资源
      最近更新 更多