我真的不能没有想过的时候,我会用git merge
,而不是git rebase
和不希望有一个承诺现身.有没有办法配置git默认快速关闭?事实上,有一个--ff
选项似乎意味着有一种方法,但我似乎无法在文档中找到它.
我之前已经问过如何在git存储库中压缩前两个提交.
虽然这些解决方案非常有趣,而且并不像git中的其他一些东西那样令人惊讶,但如果你需要在项目开发过程中多次重复这个过程,它们仍然是一个众所周知的伤害.
所以,我宁愿只经历一次痛苦,然后能够永远使用标准的交互式rebase.
那么,我想做的是拥有一个空的初始提交,仅仅是为了成为第一个提交.没有代码,没有任何东西.只是占用空间,因此它可以作为rebase的基础.
我的问题是,拥有一个现有的存储库,如何在第一个存储库之前插入一个新的空提交,并将其他所有人转移?
在Git我可以这样做:
1. Start working on new feature: $ git co -b newfeature-123 # (a local feature development branch) do a few commits (M, N, O) master A---B---C \ newfeature-123 M---N---O 2. Pull new changes from upstream master: $ git pull (master updated with ff-commits) master A---B---C---D---E---F \ newfeature-123 M---N---O 3. Rebase off master so that my new feature can be developed against the latest upstream changes: (from newfeature-123) $ git rebase master master A---B---C---D---E---F \ newfeature-123 M---N---O
我想知道如何在Mercurial中做同样的事情,我已经在网上搜索了答案,但我能找到的最好的是:git rebase …
假设您有一个包含三个提交A,B和C的历史记录:
A-B-C
Run Code Online (Sandbox Code Playgroud)
我想将两个提交A和B组合到一个提交AB:
AB-C
Run Code Online (Sandbox Code Playgroud)
我试过了
git rebase -i A
Run Code Online (Sandbox Code Playgroud)
这打开了我的编辑器,其中包含以下内容:
pick e97a17b B
pick asd314f C
Run Code Online (Sandbox Code Playgroud)
我改成这个
squash e97a17b B
pick asd314f C
Run Code Online (Sandbox Code Playgroud)
然后Git 1.6.0.4说:
Cannot 'squash' without a previous commit
Run Code Online (Sandbox Code Playgroud)
有办法还是不可能?
采取以下案例:
我在主题分支中有一些工作,现在我已准备好合并回主人:
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
Run Code Online (Sandbox Code Playgroud)
我从master执行合并,解决冲突,现在我有:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | eb3b733 3 [origin/master]
|/
* 38abeae 1
Run Code Online (Sandbox Code Playgroud)
现在,合并花了我一些时间,所以我再做一次提取并注意到远程主分支有新的变化:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
| | * e7affba 4 [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
Run Code Online (Sandbox Code Playgroud)
如果我从master中尝试'git rebase origin/master',我将被迫再次解决所有冲突,并且我也失去了合并提交:
* d4de423 2 [master]
* e7affba 4 [origin/master]
* …
Run Code Online (Sandbox Code Playgroud) 在进行git rebase时,我常常难以解决在解决冲突时"本地"和"远程"发生的事情.我有时会产生这样的印象:他们将一方提交交换到另一方提交.
这可能(肯定)因为我还没有正确理解.
变基础时,谁是'本地',谁是'偏远'?
(我使用P4Merge解决冲突)
我有一个公共存储库的分支,我正在尝试使用原始存储库中的当前提交更新我的分支:
$ git fetch <remote>
remote: Counting objects: 24, done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 20 (delta 12), reused 0 (delta 0)
Unpacking objects: 100% (20/20), done.
From git://github.com/path_to/repo
9b70165..22127d0 master -> $/master
$ git rebase <remote>
fatal: Needed a single revision
invalid upstream <remote>
Run Code Online (Sandbox Code Playgroud)
它<remote>
取代了我的远程名称,实际上并不是我的远程名称.关于这个错误的文档似乎有点松散.
好的.如果我在一个分支上(比方说working
),并且我希望合并来自另一个分支的更改(比方说master
),那么我git-merge master
在working
分支上运行命令,并且更改将合并而不会重新定义历史记录.如果我运行git-rebase master
,那么更改master
将被重新放置在我的working
分支的顶部.但是,如果我想合并更改master
但是将我的更改working
重新组合在一起,该怎么办?我怎么做?可以吗?
我可以git-rebase working
在我的master
分支上运行以将我的更改放在master
分支的顶部,但我希望能够在我的working
分支中执行此操作,而我不知道如何.我能想到的最接近的是创建一个新的分支master
,然后working
在其上更改rebase 的变化,但之后我会有一个新的分支而不是改变working
分支.
我想重新定义一个特定的提交,而不是另一个分支的HEAD:
A --- B --- C master
\
\-- D topic
Run Code Online (Sandbox Code Playgroud)
至
A --- B --- C master
\
\-- D topic
Run Code Online (Sandbox Code Playgroud)
代替
A --- B --- C master
\
\-- D topic
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我在git中变基础,我得到的一个冲突是"两个都添加" - 也就是说,在我的分支中已经独立添加了完全相同的文件名,并且在分支中我正在重新定位. git status
告诉我:
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both added: src/MyFile.cs
Run Code Online (Sandbox Code Playgroud)
我的问题是,我该如何解决这个问题?我必须使用合并工具还是只能从命令行执行此操作?如果我git rm src/MyFile.cs
,git如何知道我要删除哪个文件版本以及我想保留哪个文件?
git ×10
rebase ×10
git-rebase ×5
merge ×4
branch ×1
conflict ×1
dvcs ×1
fast-forward ×1
github ×1
mercurial ×1