我有一位同事声称这git pull是有害的,并且每当有人使用它时都会感到不安.
该git pull命令似乎是更新本地存储库的规范方法.使用git pull创建问题?它创造了什么问题?有更好的方法来更新git存储库吗?
在帮助朋友解决git问题的同时,我不得不介绍一个需要与分支完全分离的master分支.这个分支的内容确实与master分支上开发的内容有不同的起源,但它们将master在以后合并到分支中.
我记得从底层向上阅读John Wiegley的Git,分支本质上是一个遵循某个约定的提交的标签,以及如何将提交绑定到文件树,并且可选地绑定到父提交.我们使用git的管道创建了对现有存储库的无父提交:
所以我们摆脱了索引中的所有文件......
$ git rm -rf .
Run Code Online (Sandbox Code Playgroud)
...从tarball中提取目录和文件,将其添加到索引中...
$ git add .
Run Code Online (Sandbox Code Playgroud)
...并创建了一个树对象......
$ git write-tree
Run Code Online (Sandbox Code Playgroud)
(git-write-tree告诉我们创建的树对象的sha1sum.)
然后,我们提交了树,没有指定父提交......
$ echo "Imported project foo" | git commit-tree $TREE
Run Code Online (Sandbox Code Playgroud)
(git-commit-tree告诉我们创建的提交对象的sha1sum.)
...并创建了一个指向新创建的提交的新分支.
$ git update-ref refs/heads/other-branch $COMMIT
Run Code Online (Sandbox Code Playgroud)
最后,我们回到master分公司继续在那里工作.
$ git checkout -f master
Run Code Online (Sandbox Code Playgroud)
这似乎按计划进行.但这显然不是我推荐给刚刚开始使用git的人的一种程序,温和地说.有没有更简单的方法来创建一个与目前存储库中发生的所有内容完全无关的新分支?
采取以下案例:
我在主题分支中有一些工作,现在我已准备好合并回主人:
* 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) 我一直在寻找,但我找不到这三个版本的MSYS正在发生什么的详尽描述.(完全有可能我只是不知道该寻找什么.)我明白MSYS是支持使用MinGW进行开发的Linux工具的最小端口,但我不清楚它们三者之间的关系还是开发/维护它们的团队.
要解决的具体问题:
我在推送到github存储库时收到此消息.你能告诉我一步一步修复它吗?我只推了一次就成功了.但是,当我更新一个项目并尝试推送我的第二次提交时,它显示"主人拒绝非快进"并且不允许我推送.请解释一下程序.
我正在尝试学习在Git 1.7.11中添加的新git-subtree命令.添加子树后,我似乎失去了变基的能力.我有一个带有README文件的主存储库和一个库存储库,它也有一个README文件.我将它添加到lib目录subtree add:
$ git subtree add -P lib/mylib myliborigin master
Run Code Online (Sandbox Code Playgroud)
这很好,但现在历史看起来像这样:
* 22c1fe6 (HEAD, master) Merge commit 'b6e698d9f4985825efa06dfdd7bba8d2930cd40e' as 'lib/mylib' -
|\
| * b6e698d Squashed 'lib/mylib/' content from commit d7dbd3d
* b99d55b Add readme
* 020e372 Initial
Run Code Online (Sandbox Code Playgroud)
现在当我想要反对我的repo origin/master并且它失败时因为squash commit直接应用于它不适用的父提交,因为它被应用于repo的根而不是我添加的时候给它的前缀子树.
如果我看一下壁球提交,原因很清楚.没有关于前缀的信息.这只是原始的mylib提交压扁在一起.只有下一个合并提交知道它的任何内容,但rebase不会在此处考虑它.
是否有任何变通方法(除了永远不会对子树提交进行重新定位)?
鉴于以下git历史:
C-I origin/master
/
A-B-F-G-H master
\ /
D-E branch-b
Run Code Online (Sandbox Code Playgroud)
我想重新定义我的本地master分支origin/master,但我想保留合并提交G.当我尝试简单地做git rebase origin/master一会儿时master就被压扁了D..E,G并用提交消息提交了E,所以有一个合并的历史丢失了.有没有办法保留这个合并,同时仍然得到rebase?为清楚起见,我的预期结果是:
A-B-C-I-F-G-H master
\ /
D-----E branch-b
Run Code Online (Sandbox Code Playgroud) 简短版本:只有在执行本地提交后明确合并时,是否需要保留合并?究竟会发生什么?它是否将您提交的代码重新应用于合并的分支?
请解释什么时候git pull --rebase --preserve-merges对常规有用git pull --rebase?我git pull --rebase在这里阅读了一个问题:http:
//notes.envato.com/developers/rebasing-merge-commits-in-git/
这可能会导致代码更改重复.
我在这里读到:什么时候`git pull --rebase`让我陷入困境?
只有在你提交了一些提交后才基本上进行了修改,才会发生这种情况.
所以我不确定我什么时候需要git pull --rebase --preserve-merges,如果使用它就不好了 git pull --rebase.
在合并到远程分支之前,我提交了一些测试代码.这次合并产生了很多冲突,并且花了一些时间才对.所以我的历史看起来像这样:
7ab562c Merge from remote branch
... whole load of commits brought across from the remote branch...
f3e71c2 Temporary TESTING COMMIT
Run Code Online (Sandbox Code Playgroud)
测试代码很好,我真的只想更改提交消息.通常情况下我会继续前进git rebase -i f3e71c2^(因为这还没有被推动),但是我被一位同事告知,这会搞砸合并.我真的不想搞砸合并:)
我的同事是对的吗?如果是这样,我能做些什么,或者我只需要忍受这段历史?