我有一个要转换为 Git 的 Mercurial 存储库。提交历史非常大,我不需要新仓库中的所有提交历史。一旦我将提交历史转换为 Git(并且在推送到新存储库之前),我想将某个标签之前的所有提交压缩为一个提交。
所以,如果我有:
commit 6
commit 5
commit 4
commit 3
commit 2
commit 1 -- First commit ever
Run Code Online (Sandbox Code Playgroud)
我想结束:
commit 6
commit 5
commit X -- squashed 1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)
注意:我需要压缩数以千计的提交。因此,手动挑选/标记它们不是一种选择。
使用的--keep-empty选项时遇到一些麻烦git rebase,并且不确定是否误解了该选项的作用,还是有错误。
这是一个最小的示例:
创建一个新的Git存储库和一个初始的,不相关的提交。
$ git init
$ echo something >base.txt
$ git add base.txt
$ git commit -m 'some base commit to not run into the root corner case'
Run Code Online (Sandbox Code Playgroud)创建一个新的提交,添加两个新文件。
$ echo A >a.txt; echo B >b.txt
$ git add a.txt b.txt
$ git commit -m 'add A and B'
Run Code Online (Sandbox Code Playgroud)修改其中一个文件。
$ echo A1 >a.txt
$ git add a.txt
$ git commit -m 'change A'
Run Code Online (Sandbox Code Playgroud)修改另一个文件。
$ echo B1 >b.txt
$ git add b.txt …Run Code Online (Sandbox Code Playgroud)这是我在重新设置当前分支同时保持本地分支不被压扁时通常会做的事情:
git fetch origin
git rebase -r origin/develop
Run Code Online (Sandbox Code Playgroud)
-r是--rebase-merges,我更喜欢--preserve-merges
我的问题是:有没有办法在做的时候通过这个git pull --rebase?
例如 - 我想像这样运行上面的命令的等价物:
git pull --rebase=rebasemerges origin develop
代替:
git pull --rebase=preserve origin develop
**编辑:好的 - 看起来像 2.22,--preserve-merges正在被弃用而支持--rebase-merges. 这是因为git rebase- 手指越过变化被延续到git pull --rebase
我想用git重写一个提交,所以我做了一个git rebase -i 00112233或类似的事情,但在不对将应用的提交进行任何更改的情况下,发生了合并冲突。输入合并命令,弹出编辑器,我接受其中的内容,并且存在合并冲突。
我的理解git rebase -i是将HEAD其设置为00112233,然后00112233 按编辑器中指定的顺序应用之后的提交(由于已经应用到当前状态,因此它们是一致的)(在这种情况下,我没有更改) )。我不知道该过程将如何导致合并冲突。
发生这种情况有什么方式?
如果我有两个提交,它们之间有许多提交的距离,并且在它们两个中提交了许多文件,那么如何最好地将一个大块从一个移动到另一个,例如:
在提交 100 中:我在文件“aa.txt”以及这个文件中有许多文件更改和许多更改:
- aaaa
- bbbb
+ cccc
10 次提交后,我又有一次提交更改了很多文件和“aa.txt”:
+dddd
我想将行更改-aaaa从前者移动到后者。
是否有任何 CLI/UI 工具可以帮助您轻松完成此操作?(我显然对历史重写没有问题)
我有一个存储库,其中有两个分支,master和master-old,它是作为孤儿分支创建的。
现在我想对整个masteron进行变基master-old,但每个提交的树应该保持不变,即每个提交的工作副本在变基之前master和master-old之后看起来应该完全相同。
Current state
-------------
A - B - C - D <--- master
E - F - G - H <--- master-old
Desired state
-------------
E'- F'- G'- H'- A'- B'- C'- D' <--- master
Run Code Online (Sandbox Code Playgroud)
我尝试使用 来完成此操作git rebase --onto master-old --root。问题是,在 的初始提交master和整个提交历史记录中master-old,创建了许多相同的文件,因此我需要解决大量冲突。
有没有办法以保持每次提交树完整的方式重写历史记录?
似乎已经有一些类似的问题,但是这些都不是我想要的。
假设我有这样的提交历史
* xxxxxxxH (HEAD -> B) Latest commit
* (more commits)
* xxxxxxxG (B) More commits
* xxxxxxxF Merge branch 'master' into B
|\
| * xxxxxxxE (master) Another commit on master
| * (more commits here)
| * xxxxxxxD Commit on master
* | xxxxxxxC Another commit
* | (more commits here)
* | xxxxxxxB First commit on branch A
|/
* xxxxxxxA (master) some commit
Run Code Online (Sandbox Code Playgroud)
现在,我想重写分支A的历史记录,可能合并或编辑某些提交,但是我也想更改分支A上的第一次提交,并且我想保留合并,以便将master合并到A中。
我首先进行了直观的尝试git rebase -i -p xxxxxxxB,但是很明显,其中不包含xxxxxxxB提交本身。因此,另一尝试git rebase -i -p …