我想在我的主人身上申请一个小主题分支(在贡献者的远程仓库上).我认为这样做的规范方法是:
git merge contributor/topic-branch
Run Code Online (Sandbox Code Playgroud)
但是我希望逐个应用提交而不是生成合并提交.
天真地运行git rebase contributor/topic-branch显然不会起作用,因为它将我的主应用到主题分支,就好像主题分支是我的上游.所以我尝试了这个:
git rebase master contributor/topic-branch
Run Code Online (Sandbox Code Playgroud)
这就是我想要的,除了现在我有一个独立的HEAD,我需要修复master分支指向HEAD(使用branch -f).我当然可以编写一个Bash函数来自动执行此操作,但是有没有"正确"的方法来引入主题分支而不使用merge?
我经常发现自己愿意(交互式地)重新绑定当前工作分支中未合并到master的所有提交.我该如何做到这一点?
首选基于git命令/参数的解决方案(我在使用Bash的Linux和使用PowerShell的Windows上都使用git).
命令:
git rebase --no-verify
Run Code Online (Sandbox Code Playgroud)
...允许我在不运行我创建的 git rebase 挂钩的情况下进行变基。
但我还将git pull设置为 rebase 而不是合并,所以现在当我执行 pull 时,它会运行我的 rebase 触发器。有没有办法将 --no-verify 选项传递给 git pull 并让它在变基时使用该选项?
(除了创建包装脚本以暂时将触发器移开,然后再将它们移回的最后手段之外)。
我已在 my 中rebase.autoStash设置为,这允许我在脏工作树上运行。但是,如果 a由于某种原因中止,则对跟踪文件的所有更改都将消失(即不会重新应用自动存储)。在这种情况下应用自动存储的正确方法是什么?'true'.gitconfigrebaserebase
如何重现:
git config rebase.autostash true。运行git rebase -i HEAD^^^。这会打印如下内容:
Created autostash: 75a5188
HEAD is now at f0c93f1 WIP
Run Code Online (Sandbox Code Playgroud)中止变基,例如让编辑器以错误代码退出(:cq在 Vim 中)。
使用git 2.11,git rebase文档说:
如果提供了--onto选项,则当前分支将重置为<upstream>或<newbase>.这与git reset --hard(或)具有完全相同的效果.ORIG_HEAD设置为在重置之前指向分支的尖端.
我理解它upstream并且newbase指向相同的"基本引用",这意味着下面的两个rebase语法是等价的:
git rebase ABC
git rebase --onto ABC
Run Code Online (Sandbox Code Playgroud)
这是我设置的演示.让我们假设当前分支是FeatureABC与远程分支完全同步.
#---create two identical branches, behind current branch by 5 commits
(FeatureABC) git branch Demo1-Rebase-ABC HEAD~4
(FeatureABC) git branch Demo2-Rebase-onto-ABC HEAD~4
#---Make a new commit in branch Demo1
git checkout Demo1-Rebase-ABC
echo "Demo of: git rebase FeatureABC Demo1-Rebase-ABC" > ./Demo1_BogusFile.txt
git add ./Demo1_BogusFile.txt
git commit -m "Create file Demo1_BogusFile.txt"
git rebase FeatureABC
Run Code Online (Sandbox Code Playgroud)
首先,倒带头重播你的工作
...应用:创建文件Demo1_BogusFile.txt
git log --oneline -3 …
我们有一个工作流程,其中只有一名团队成员在多个功能分支上工作。工作是这样的,下一个分支都依赖于他之前所做的分支。默认分支是develop.
我们来说说这个场景:
featureA分支,完成工作,推送分支,并在 GitHub 上创建 PRfeatureB分支(基于featureA一个分支),进行工作并进行公关featureC分支,(基于featureB)做工作并公关它featureD分支,(基于featureC)做工作并公关它尚未合并任何 PR。
现在,项目经理介入并开始合并。合并走这样的路:
featureA开发他这边的开发人员这样做:
git checkout develop
git fetch origin
git rebase origin/develop
git checkout featureB
git rebase origin/develop
git push origin featureB
Run Code Online (Sandbox Code Playgroud)此时我们得到错误:
machine /c/Work/ (featureB)
$ git push origin featureB
To https://github.com/x.git
! [rejected] featureB -> featureB (non-fast-forward)
error: failed to push some refs to 'https://github.com/x.git'
hint: Updates …Run Code Online (Sandbox Code Playgroud) 我有一个包含 10 个提交的分支。现在 master 更改了,我想将我的分支重新设置为新 master 的 HEAD。然而,一些新的主提交甚至使我的分支的第一次提交无法编译(没有合并冲突)。如果您的所有提交最终都无法编译,那么重新设置分支对我来说似乎毫无意义。
我想要做的是告诉 get “做一个 rebase,但在从我的分支重新设置每个提交后等待”。这样,我可以检测每次提交后代码是否仍然编译,使其编译(如果需要),然后提交并继续。
这可能吗?是否有干净的变基替代方案,以便每次提交仍将编译?
一个常见的场景是在推送到存储库之前执行本地 git 提交的交互式 rebase。一种方法是找到本地提交的数量并运行命令(在本例中为 3 个本地提交)
git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)
有没有什么办法可以省去事先找出本地提交次数的需要,直接运行一个命令,意思是git rebase -i 'commits not yet pushed'.
编辑:让我通过给出一个特定的场景来详细说明。我执行三个提交:
Commit change A
Commit change B
Commit change C
Run Code Online (Sandbox Code Playgroud)
此时我意识到C中的变化属于A中的变化,所以我想rebase给我我想要的:
Commit containing A + C
Commit containing B
Run Code Online (Sandbox Code Playgroud)
在这一点上,没有任何推动。看到我不记得变化 C 有多少变化,我做了一个
git log @{u}..
Run Code Online (Sandbox Code Playgroud)
并确定我有三个变化。所以现在我想做一个
git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)
或者,正如@cosimo93 指出的那样,我可以简单地做
git rebase -i
Run Code Online (Sandbox Code Playgroud) 我想在我的本地分支重新排序 git 提交,目前,我的分支看起来像这样。
xxxxxxx-0-1-2-3
现在我想将顺序更改为以下
xxxxxxx-0-2-1-3 怎么用git来做呢?
以下问题Can “git pull” automatically stash and pop pending changes有使用两者的解决方案:
git pull --rebase --autostash
git pull --ff-only
我有点困惑我应该使用哪个。他们真的完成了相同的结果吗?提出了非常相似的问题,其中没有--autostash参数以及--rebase