是否可以重新建立修改后的提交并让 git 自动跳过旧版本的提交?
对于 Gerrit,通常需要在未通过自动或人工代码审查后修改提交。但修改后,还需要对此后所做的更改进行rebase,这是一个容易出错的过程。
在How to git commit --amend a commit that's the base of abranch 中,给出了手动省略修改的提交的选项,但由于问题不要求自动化,因此没有建议这样的解决方案。
假设我需要推送提交D以供审核,但已经进行了进一步的更改,尚不适合推送。
A---B---C(origin/master)---D---E---F(devel)
>>> git push origin <hash-of-D>:refs/for/master
Run Code Online (Sandbox Code Playgroud)
现在假设远程构建失败,或者审阅者发现问题。Gerrit 要求推送更新的更改是单个提交,因此我需要更改提交。
对于简单的修改,我可以交互地重新设置开发分支
>>> git rebase origin/master devel
edit D
pick E
pick F
A---B---C(origin/master)---D'---E---F(devel)
Run Code Online (Sandbox Code Playgroud)
更一般地说,我可能需要将更改作为临时分支进行检查,或者我可能有多个开发分支。那时,此选项不再可用。相反,我可能会做类似的事情:
>>> git checkout -b amend <hash-of-D>
>>> ### Make some changes
>>> git commit --all --amend
A---B---C(origin/master)---D'(amend)
|
'---D---E---F(devel)
>>> git push origin HEAD:refs/for/master
Run Code Online (Sandbox Code Playgroud)
现在我需要变基,但由于 D 和 D' 重叠,自动合并可能会失败,或者撤消从 D 到 D' …
我对 git 有点陌生,试图了解分支/rebase 是如何工作的,以及是否有可能我搞砸了一些事情。
我和我的同事都在不同的分支机构,我需要他为我的工作所做的改变。所以我拉了他的改变。然后我做了
git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)
并删除了我不需要的他的提交。然后我向我们的存储库推送并创建了一个拉取请求,一切看起来都很好。看起来就像是我需要他的更改和我自己的更改的一项提交。
我还没合并呢 是否有可能一旦他合并,然后我合并,不知何故,因为我删除了他在我正在合并的分支上的提交,它删除了他的代码?
假设我有这种情况,是branch1从master. 经过几次提交后branch1,我还创建了另一个分支,称为branch2. 此后,其他人在 中犯了 (D) 罪master。现在我想branch1用master. 但是既然branch2的branch1哈希值已经被重写并且现在branch2丢失了呢?
master: A - B - C - D
\
branch1: E - F
\
branch2: G - H
Run Code Online (Sandbox Code Playgroud)
在 master 之上对分支 1 进行变基后,分支 2 就会丢失,因为变基重写了分支 1 的哈希值。
master: A - B - C - D
\
branch1: E - F
branch2: G - H
Run Code Online (Sandbox Code Playgroud)
在这种情况下,是否有正确的方法可以在branch1之上再次使用git rebasebranch2?
我有一个功能分支和一个主分支.我的功能分支已从主分支中检出,但在当前主分支上的某些提交之前.
我想在主分支上重新提交我的提交,但我不希望主人的历史发生变化,我希望rebase一举应用所有提交并保持repo历史的完整性远程分支.
这可能与git rebase有关吗?
在主人身上这样做
git rebase feature-branch-name
重播我的功能分支上的主人历史,这不是我的意图.
我的git有点问题。
我在github上创建了一个项目,我更改并提交了一些文件。
现在,我想使用选项变基来执行“请求”。
我做了一个拉取请求,但是如何重新设置拉取请求的基础呢?回购的原始作者是否需要接受我的请求,并且在我可以或他可以重新设定基准之后,或者我需要在请求之后重新设定基准?
我如何在提交之间变基:
假设我想在 init 和 commit 3 之间重新定位(将这些提交压缩在一起)
可以说我有
commit 5
commit 4
commit 3
commit 2
commit 1
commit init
Run Code Online (Sandbox Code Playgroud)
如果我做
git rebase -i commit 3
Run Code Online (Sandbox Code Playgroud)
我明白了:
pick commit 3
pick commit 4
pick commit 5
Run Code Online (Sandbox Code Playgroud)
然后当我做
squash commit 3
pick commit 4
pick commit 5
Run Code Online (Sandbox Code Playgroud)
我执行了这个动作,我得到了这个:
commit 3
commit 2
commit 1
commit init
Run Code Online (Sandbox Code Playgroud)
而不是我想要的。
我如何压缩 commit init<---->commit 3,而不是 commit 3<----->commit 5
提前致谢。
杰尼亚。
按照本指南,我通过删除历史上的一些重文件来缩小我们的项目存储库。这意味着 git 历史已经改变。但现在的问题是,我的其他团队成员如何在不丢失他们对当前不在远程的分支上所做的更改的情况下获得我们的 repo 的新缩小版本,并且也不会推回已删除的历史记录。
作者建议 clone 或 rebase:
拥有存储库本地克隆的任何其他人都需要使用 git rebase,或者创建一个新的克隆...
新的克隆意味着放弃任何团队成员在本地所做的所有更改。因此,rebase 似乎是更好的选择。但是我们该怎么做呢?
我在想这样的事情:(假设 master 是新功能分支的基础分支,开发人员机器上的本地分支有新工作,并且 master 受到历史重写的影响):
$ git checkout master
$ git fetch origin
$ git pull --rebase
$ git checkout new-feature
$ git rebase master
Run Code Online (Sandbox Code Playgroud)
确认一切正常然后
$ git push origin
Run Code Online (Sandbox Code Playgroud) 我有一个父分支和子分支。
当我想将子分支合并到父分支时,据说重新建立分支是最好的合并方法。
如果我们重新调整另一个分支中所做的所有更改都会进入当前的子分支,对吗?
然后,当有人想查看子分支中所做的新更改时,其他分支的更改就会太正确。
有人可以解释一下 Rebasing、Pull request 和 Merge 吗?
我正在尝试找到合并分支的最佳方法。
我有这个
a -- b -- c -- f <-- dev
\
d -- e -- g <-- feature
Run Code Online (Sandbox Code Playgroud)
我要这个
a -- b -- c -- f -- d -- e -- g <-- dev
Run Code Online (Sandbox Code Playgroud)
我知道这与 rebase 命令有关。但是,当我输入时git rebase dev feature,提交会转到功能分支并且 dev 不会更新。如果我使用,git rebase feature dev那么最后一次提交是来自 master 的提交,并且我有重复的提交。我怎样才能做到这一点?
在某些情况下,我在功能分支上执行 git pull 操作,最终得到多个烦人的“合并提交”,我可以理解它们为什么会发生,但我想将它们合并起来,使其看起来像正常提交。
我尝试使用git rebase -i --rebase-merges HEAD~4但无法弄清楚如何压缩合并提交。
我做了进一步的研究,经过大量的挖掘,我能够执行以下操作,使用 rebase 将不需要的合并提交合并到正常提交中,然后在需要时压缩它们:
git checkout feature
git pull # will create merge commits
git checkout featur_backup # to create a backup
git switch --orphan emty_commit
git commit -m "First empty commit for the feature branch" --allow-empty
git switch feature
git rebase empty_commit
git rebase -i --root # this allows you to squash commits
git branch -D empty_commit
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来合并合并提交?
笔记:
git ×10
rebase ×10
git-rebase ×3
github ×2
pull-request ×2
azure-devops ×1
commit ×1
gerrit ×1
merge ×1
squash ×1