相关疑难解决方法(0)

Git - 在特定提交之前压缩历史中的所有提交

我有一个要转换为 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)

注意:我需要压缩数以千计的提交。因此,手动挑选/标记它们不是一种选择。

git

5
推荐指数
3
解决办法
2104
查看次数

交互式重新设置后,即使使用了--keep-empty,也删除了空提交

使用的--keep-empty选项时遇到一些麻烦git rebase,并且不确定是否误解了该选项的作用,还是有错误。

这是一个最小的示例:

设定

  1. 创建一个新的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)
  2. 创建一个新的提交,添加两个新文件。

    $ 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)
  3. 修改其中一个文件。

    $ echo A1 >a.txt
    $ git add a.txt
    $ git commit -m 'change A'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 修改另一个文件。

    $ echo B1 >b.txt
    $ git add b.txt …
    Run Code Online (Sandbox Code Playgroud)

git git-rebase

4
推荐指数
2
解决办法
1665
查看次数

git pull --rebase: 传递 --rebase-merges

这是我在重新设置当前分支同时保持本地分支不被压扁时通常会做的事情:

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 rebase git-pull

4
推荐指数
1
解决办法
2206
查看次数

没有进行任何更改时,如何在git交互式rebase中发生冲突?

我想用git重写一个提交,所以我做了一个git rebase -i 00112233或类似的事情,但在不对将应用的提交进行任何更改的情况下,发生了合并冲突。输入合并命令,弹出编辑器,我接受其中的内容,并且存在合并冲突。

我的理解git rebase -i是将HEAD其设置为00112233,然后00112233 按编辑器中指定的顺序应用之后的提交(由于已经应用到当前状态,因此它们是一致的)(在这种情况下,我没有更改) )。我不知道该过程将如何导致合并冲突。

发生这种情况有什么方式?

git

3
推荐指数
1
解决办法
891
查看次数

我如何在提交之间移动部分更改(大块)?

如果我有两个提交,它们之间有许多提交的距离,并且在它们两个中提交了许多文件,那么如何最好地将一个大块从一个移动到另一个,例如:

在提交 100 中:我在文件“aa.txt”以及这个文件中有许多文件更改和许多更改: - aaaa - bbbb + cccc

10 次提交后,我又有一次提交更改了很多文件和“aa.txt”: +dddd

我想将行更改-aaaa从前者移动到后者。

是否有任何 CLI/UI 工具可以帮助您轻松完成此操作?(我显然对历史重写没有问题)

git

3
推荐指数
1
解决办法
1308
查看次数

将整个 git 分支重新设置为孤立分支,同时保持提交树完整

我有一个存储库,其中有两个分支,mastermaster-old,它是作为孤儿分支创建的。

现在我想对整个masteron进行变基master-old,但每个提交的树应该保持不变,即每个提交的工作副本在变基之前mastermaster-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,创建了许多相同的文件,因此我需要解决大量冲突。

有没有办法以保持每次提交树完整的方式重写历史记录?

git git-rebase

3
推荐指数
1
解决办法
863
查看次数

--preserve-合并当前分支中所有提交的交互式rebase

似乎已经有一些类似的问题,但是这些都不是我想要的。

假设我有这样的提交历史

* 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 …

git rebase git-rewrite-history

2
推荐指数
1
解决办法
1324
查看次数

标签 统计

git ×7

git-rebase ×2

rebase ×2

git-pull ×1

git-rewrite-history ×1