我已经查看了有关使用git diff和git修订(HEAD,ORIG_HEAD,FETCH_HEAD等)的各种SO答案,我仍然没有找到一种简单的方法来列出自本地分支开始以来所做的更改,或者自上次以来变基.
通过简单的我的意思是,无需查找并粘贴提交SHA也不必指望我想多少提交回头.
git diff origin/master 是接近,但它指的是遥控器,因为我检查了它的新分支.
我希望有类似的东西git diff BASE_HEAD可供选择.
......除非已经有办法做到这一点.有人有答案吗?
如何只知道分支名称,如何为给定分支中的所有提交生成补丁?
此步骤是复杂工作流程的一部分,所有这些工作流程都是自动化的.因此,要求某人手动确定分支中的第一次提交不是一种选择.
请注意,依赖于reflog的任何内容都不是一个选项,因为分支中的更改不是在本地进行的.
我在想是否有一种方法,当我将一个分支合并到另一个分支时,所有已更改的文件都列在我的提交消息中,而不仅仅是在两个分支中都被修改的那些.通过查看合并提交,这将使我更好地了解分支中的更改内容.有没有办法做到这一点?
我如何知道何时创建了一个git分支?
我不想知道什么时候第一次提交到那个分支.我想知道什么时候创建了这个分支.
这是一个重现一个工作示例的脚本:
#! /bin/bash
set -x
set -e
mkdir test
cd test
git init
echo "hello" >readme
git add readme
git commit -m "initial import"
date
sleep 5
git checkout -b br1
date # this is the date that I want to find out.
sleep 5
echo "hello_br1" >readme
git commit -a -m "hello_br1"
date
echo "hello_br1_b" >readme
git commit -a -m "hello_br1_b"
git checkout master
echo "hello_master" >readme
git commit -a -m "hello_master"
git branch -a;
git log …Run Code Online (Sandbox Code Playgroud) 对于代码中的每个缺陷,我创建单独的分支.当缺陷修复后,我将这个分支合并到master中,所以我的历史如下图所示(我们看到两个分支有修复):
defect1 fix defect2 fix
a---b---c---d e---f
/ \ / \
---o---1---x---y---z---2---o---3---w---4---o---
Run Code Online (Sandbox Code Playgroud)
问题是如何在任何时间点(例如,对于过去的任何封闭缺陷)获取fix1(在分支开始(1)和分支结束(2)之间)或fix2(在(3)和(4)之间的差异)之间的差异.
更新:实际的问题是如何计算出的SHA summs a和d或e和f执行下一个明显的diff命令diff <commit> <commit>
假设如下图:
A -- B -- C -- D -- E -- F
\
G -- H -- I
Run Code Online (Sandbox Code Playgroud)
我想找到G以便能够通过交互式rebase来压缩提交(但仍然在主题分支上保留一个提交),稍后将对其进行检查和合并.我不想仅仅修改整个分支,因为我想保留有分支的信息并将其合并.
(我知道我可以查看历史记录,只使用提交的SHA校验和,但我正在寻找一种方法来实现它,而无需手动挖掘信息或计算提交了多少提交并使用〜来自HEAD那个数字).
编辑:澄清我想要实现的目标:
我想避免这个:
A -- B -- C -- D -- E -- F -- J
\ /
G -- H -- I -- -- -- -
Run Code Online (Sandbox Code Playgroud)
而是有类似的东西:
A -- B -- C -- D -- E -- F -- J
\ /
G' -- -- -- -- -- -- -
Run Code Online (Sandbox Code Playgroud)
换句话说,我想将主题分支上的交互式rebase压缩为一个,但仍保留分支并使用常规合并将主题分支中的更改集成到主分支中.
我有两个分支:master和test-branch(分支master).我的工作看起来如下:
git checkout mastergit checkout -b test-branchgit checkout mastergit pull - >其他人已经做出改变大师git checkout test-branchgit rebase -i masterpick将交互式控制台中的第一个更改为s我想做的是在重新定位test-branch之前压缩所有提交,这样我只需要解决一次合并冲突.这可能吗?如果是这样,怎么样?
我有一个简要命名的功能分支feature,它有大约100个提交,都与各种功能相关.这些提交都是随着时间的推移而合并到主分支中的.我想列出分支上的所有提交,以便我可以将该功能重新添加到其他项目中.
基本上我想在下图中为绿点提供ID.

我怎么能在Git中做到这一点,然后转到gitk或类似的工具并手工收集所有相关的提交ID?
据我所知,commit对象只包含有关父母的信息,所以如果我遇到类似这样的情况:
* branch-1
|
o
|
o master
|
o
Run Code Online (Sandbox Code Playgroud)
这是某种等价的
* branch-1
|
o
/
o master
|
o
Run Code Online (Sandbox Code Playgroud)
但如果我的主人会前进呢?
o master
|
o * branch-1
| |
o o
|/
o
|
o
Run Code Online (Sandbox Code Playgroud)
在分支-1上,git log --graph --decorate只会告诉我:
* branch-1
|
o
|
o
|
o
Run Code Online (Sandbox Code Playgroud)
如果我知道我从哪个分支开始,我可以打电话git merge-base master branch-1,但如果我不知道我从哪个分支开始怎么办?
PS.我还在学英语,但有时候我犯的是愚蠢的错误.我正在尽我所能,用英语写问题和答案,但如果你在任何错误的情况下编辑我的帖子,我会很高兴.我保证,你的努力不会浪费.
我正在尝试确定分支中的第一个提交.我已经阅读了其他各种SO帖子(包括用Git找到一个分支点?),但是他们没有给我我想要的东西.
通过查看分支图,我可以看到有可能确定分支何时从主分支(在包含的图像上,紫色线来自"第二次提交主服务器"),但我不能在文本中使用命令行工具(git log --graph工作但不是我想要的).
我之后的提交是0124fc8,即第一次提交功能/新分支.
所有合并回主人都完成了--no-ff.
我试过git merge-base feature/new-branch master,但是这给了我0f5e36f(--all做同样的)
我也尝试了git rev-list --boundary feature/new-branch...master,这给了我几个提交,但没有一个是我想要的.

我需要使用这样的单个提交来恢复整个分支:
[topic]
o---o---o-------X
/
| [master]
---o---o---o
Run Code Online (Sandbox Code Playgroud)
提交X必须具有类似a master~2(主题分支的原点)的状态
我的解决方案是:
git rev-list --reverse master..topic | while read SHA; do
git revert -n ${SHA}
done
git commit -m "Reverted topic branch"
Run Code Online (Sandbox Code Playgroud)
有更好(更短)的解决方案吗?
这个目的
想象一下,我有一种几乎基于git-flow的回购.
[release-3]
o---o---o---o
/ \ [fix-for-rc-3]
/ o---o---o
/
| [development]
---o---o---o
Run Code Online (Sandbox Code Playgroud)
我有一个development分支,即将到来的release-3分支和一个所谓的hot-fix-feature-for-rc-3分支.在这个分支中,我正在做一些丑陋的黑客来完成我的发布,但我根本不想要它,development因为更多"正确"的解决方案已经落在这里,但release-3由于某种原因无法应用于分支.所以,我必须做以下事情......
[release-3]
o---o---o---o--------------------M
/ \ [fix-for-rc-3] /
/ o---o---o----------------X
/ \
| \[development]
---o---o---o---------------------------------D
Run Code Online (Sandbox Code Playgroud)
我必须合并fix-for-rc-3到release-3(点M),然后做一个"revert-all-this-shit"提交(点X)并合并它development(点D)所以这段代码永远不会到达这里,即使那时整个release-3分支也被合并到 …
是否有任何--root与rebase命令中的标志等效的reset命令?
git reset --root
Run Code Online (Sandbox Code Playgroud)
假设我想重置为当前分支中的第一个提交:我是否必须手动挖掘历史记录并找到该提交的哈希值,或者是否有一种简单的方法可以重置为第一个可用的提交?
在我们的Git流程中,"master"是当前发布周期的主题和修复分支的集成分支,但我们还维护一个"稳定"分支,我们必须谨慎地向后移植已经在master上成功测试的一些修复.
所有困难都是分支已经合并回"master"(否则它很容易与rebase --onto)
我描述的初始情况图:
I--J (stable)
/
/
/
- A - B - C - D - E - F - G (master)
\ /
X -- Y (fix/123)
Run Code Online (Sandbox Code Playgroud)
我们想要达到的那种情况的图表:
I--J (stable)
/ \
/ X'- Y' (fix/123-stable)
/
- A - B - C - D - E - F - G (master)
\ /
X -- Y (fix/123)
Run Code Online (Sandbox Code Playgroud)
更复杂的情况是可能的,例如多次合并以完成修复:
- A - B - C - D - E - F - G - …Run Code Online (Sandbox Code Playgroud) git ×13
git-branch ×4
branch ×3
merge ×2
rebase ×2
cherry-pick ×1
diff ×1
git-diff ×1
git-merge ×1
git-patch ×1
git-rebase ×1
git-revert ×1