Git - 重命名本地分支,其中有 2 个提交被推送到远程

Git - Rename a local branch which has 2 commits pushed to remote

我有一个跟踪远程分支的分支,我已经提交了 2 个已推送到远程分支的提交,但尚未 PR 并合并到主分支中。

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

这个工作流程是否正确?提前致谢...我对 Git 的大部分内容仍然相对陌生,因此非常感谢任何意见。

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

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

  1. checkout master拉电流"state"
$ git checkout master
$ git pull
$ git log
  1. 在 2 次合并提交后复制提交 ID
  2. 重置主机(确定你做了什么!)
$ git reset --hard <commit-id-that-you-copied>
  1. 查看本地master日志
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

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

(一般来说,分支的名字不用太在意)

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

  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. 删除旧分支

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

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

假设要重命名的分支是 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

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

$ 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 有时是这样)您总是可以先压缩您的本地存储库,并将其放在某处,这样您至少可以在本地恢复,甚至如有必要,将旧文件复制到存储库中;-)