gpt4 book ai didi

git - 多个集结区

转载 作者:IT王子 更新时间:2023-10-29 01:06:39 26 4
gpt4 key购买 nike

我可以有多个暂存区域或使用 git 实现类似的效果吗?

我的典型工作流程是:

  • 工作,工作,工作
  • 现在我有了一些有用的想法,让我们提交它 git add -p, y, y
  • 但首先是这些较小的样式更改:git reset HEAD .
  • git add -p, n, n, y, q , git commit -m "样式改变"
  • git add -p .. 提交实际内容

有时我需要从一大堆更改中做出 20 个较小的提交。如果我可以像 git add -p 一样运行补丁,然后将每个补丁“分发”到它自己的暂存区域并分别提交每个区域,这将每天节省我几个小时。

最佳答案

编辑,2020 年 5 月 30 日:在 Git 2.15 或更高版本中,我建议使用 git worktree 而不是尝试执行以下操作。对添加的工作树有一些限制,这使得它们对这种工作流程有些烦人,但它可以工作,并且内置在现代 Git 中。

请注意,如果您确实做了我在下面描述的事情,git gc 将不知道要查看您的替代索引文件,事实上,从它的原始文件在 Git 2.5 中引入,直到在 Git 2.15 中得到修复,git gc 忘记检查添加的工作树及其索引文件!

参见 VonC's answer了解更多。


事实上,您可以在 git 中拥有多个不同的暂存区(更确切地说,多个索引文件)。无论如何,要达到您想要的效果,您必须编写自己的 git add -p 变体,所以我在这里要做的是勾勒出如何执行此操作的轮廓。

默认索引文件——如果你不将它指向其他索引文件,git 使用的那个文件——位于 .git/index (或者,更正确的 shell,$ GIT_DIR/.index 其中 $GIT_DIR 是从环境中获取的,或者,如果没有在那里设置,则来自 git rev-parse --git-dir)。

但是,如果您设置了环境变量 GIT_INDEX_FILE,git 将使用该文件作为索引。因此,您可以通过执行以下操作来开始“将更改分散到四个分支”过程:

GIT_DIR=${GIT_DIR:-$(git rev-parse --git-dir)} || exit 1
index_tmp_dir=$(mktemp -d) || exit 1
trap "rm -rf $index_tmp_dir" 0 1 2 3 15 # clean up on exit

# make four copies of initial staging area
for f in i1 i2 i3 i4; do
cp $GIT_DIR/index $index_tmp_dir/$f
done

# THIS IS THE HARD PART:
# Now, using `git diff-files -p` or similar, get patches
# (diff hunks).
# Whenever you're ready to stage one, pick an index for it,
# then use:
GIT_INDEX_FILE=$index_tmp_dir/$which git apply --cached < diffhunk

# Once done, commit each index file separately with some
# variation on:
for f in i1 i2 i3 i4; do
GIT_INDEX_FILE=$index_tmp_dir/$which git commit
done

对于标记为“hard part”的部分,您最好的选择可能是复制 git 的 add-interactive perl 脚本,该脚本位于 $(git --exec-path)/git-add--interactive,然后修改它以适应。要删除“恰好四次提交”限制,使这个修改后的交互式添加动态创建一个新的索引文件(通过复制原始文件,或者可能创建一个等于 HEAD 提交或其他任何内容的“空”索引; 参见 git read-tree

编辑: 部分的一些变体几乎肯定应该使用 git write-treegit commit-tree 来制作 这些提交中的每一个的新分支,使用当前提交的父级作为它们的父级,而不是允许 git commit 将提交串在一起作为线性链。这意味着还必须为这些各种新创建的分支选择一些命名方案。

关于git - 多个集结区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com