假设我有以下本地存储库,其中包含如下提交树:
master --> a
\
\
develop c --> d
\
\
feature f --> g --> h
Run Code Online (Sandbox Code Playgroud)
master是我的这是最新的稳定版本代码,develop是我的这个'下一个'版本代码,feature是一个正在准备的新功能develop.
我希望能够使用钩子在我的远程仓库上做什么,feature除非提交f是developHEAD 的直接后代,否则推送被拒绝.即提交树看起来像这样,因为功能已经git rebase打开d.
master --> a
\
\
develop c --> d
\
\
feature f --> g --> h
Run Code Online (Sandbox Code Playgroud)
那么有可能:
feature?f是后代的?从那里我将检查父分支的HEAD是什么,并查看f前任是否与父分支HEAD匹配,以确定该特征是否需要重新定位.
我创建了新的分支master:
git checkout -b testbranch
我做了20次提交.
现在我要压缩那20个提交.我这样做:
git rebase -i HEAD~20
如果我不知道有多少提交怎么办?有什么方法可以做以下事情:
git rebase -i all on this branch
我想要一个尚未合并到master的分支中的所有更改的差异.
我试过了:
git diff master
git diff branch..master
git diff branch...master
Run Code Online (Sandbox Code Playgroud)
但是,在每种情况下,diff都包含master中尚未合并到我的分支中的内容.
有没有办法在我的分支和主人之间做一个差异,排除了尚未合并到我的分支的主人的变化呢?
比方说,我创建了一个新的分支my_experiment从 master并提出了一些对提交my_experiment.如果我在启动git log时执行my_experiment,我会看到对此分支的提交,但也会在创建分支master之前进行提交my_experiments.
我会发现查看所有提交到my_experiments分支的历史记录非常有用,直到它触及该分支的创建 - 实际上是该分支的真实历史.否则,在通过日志查看提交是否在my_experiments分支上时,我不清楚.
有没有办法用Git做到这一点?
在以下示例树中:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
Run Code Online (Sandbox Code Playgroud)
我正在寻找F - xxx分支中的第一个提交.我认为有可能:
git log xxx --not master
Run Code Online (Sandbox Code Playgroud)
最后列出的提交应该是F.这是正确的解决方案还是有一些缺点?
我知道stackoverflow上有类似的问题,但没有人提出这样的解决方案,我不确定我是否做得对.
假设我有这个功能分支"foo".现在我想将它合并回master,但我添加了一些我不想在master中调试的代码.
调试代码在它自己的提交中,所以我可以git cherry-pick在每次提交时使用并省略此提交.但那会很烦人.
是否有一些"逆樱桃选择"这样做,或互动合并?
偶尔我会被问到,git上某个分支的启动是什么,或者是否在特定分支上创建了某个提交.分支的终点非常清楚:分支标签所在的位置.但是 - 它从哪里开始?琐碎的答案是:在我们创建该分支的那个提交上.但据我所知,这些信息就是为什么我会问这个问题,在第一次提交后丢失了.
只要我们知道我们分支的提交,我们就可以绘制图表来说明:
A - B - C - - - - J [master]
\
D - E - F - G [branch-A]
\
H - - I [branch-B]
Run Code Online (Sandbox Code Playgroud)
我在提交时创建了branch-B,E这就是"开始".我知道,因为我做到了.但其他人能否以同样的方式认识到它?我们可以绘制相同的图形:
A - B - C - - - - J [master]
\
\ F - G [branch-A]
\ /
D - E
\
H - I [branch-B]
Run Code Online (Sandbox Code Playgroud)
所以,现在看图表,哪个分支开始E,哪一个在B?提交D两个分支的成员还是我们可以清楚地决定它是属于分支A还是分支B?
这听起来有点哲学,但实际上并非如此.监事有时想知道,当一个分支已经开始(它通常标志着一个任务开始)和其分支的一些变化属于(得到一些改变的目的 - 是它需要的工作),我会想知道git是否提供信息(工具,命令)或定义来正确回答这些问题.
我经常读到Git使用有向无环图(DAG)数据结构,每次提交都是一个节点,而像分支和标签这样的东西作为节点的指针.
但是当我尝试使用像gitk这样的工具来显示我的提交历史时,它看起来更像是树而不是图形,因为每个父子关系都是单向的.
那么,DAG和树之间有什么区别,特别是关于Git?
我已经对一个本地分支进行了多次提交,但是我不确定将我目前拥有的内容与我的分支的起始状态区分开来的最佳方法.我知道我可以做一些事情,比如git diff HEAD HEAD~6我的分支机构有6次提交,但我希望能有一些与提交数量无关的东西.
编辑:我没有提到这个:我希望我不必挖掘日志来获取我分支的提交的哈希值.例如,如果我有80次提交,这将不是一个有趣的任务.
另外,假设我分支的原始分支已经有了几处变化.