我想从一个文件中取出一个函数并将其放入另一个文件中,但要记住责备历史。
cp a.php b.php
vim b.php
# delete everything but 1 function
vim a.php
# delete the 1 function
git add a.php b.php
git commit
但是如果我运行git blame b.php
我只会看到它指责这个新提交。
答案 0 :(得分:17)
维护责备历史记录的一般规则是在任何编辑之前先单独执行 move 提交。根据我的经验,这使得git blame
可以在不需要-C
选项的情况下工作。因此,在将文件拆分为新文件的情况下,可以在两次提交中完成:
在提供的示例中,这将是:
cp a.php b.php
mv a.php c.php
git add a.php b.php c.php
git commit
vim b.php # delete everything but 1 function
vim c.php # delete the 1 function
git add b.php c.php
git commit
答案 1 :(得分:6)
也许这个以前的SO问题可以提供信息:
How does git track source code moved between files?
解释接受的答案:基本上,Git实际上并不“存储”移动的代码;通过检查从提交到提交的整个存储库的状态,在生成像移动代码的责任这样的事情时,已经完成了事后。
答案 2 :(得分:5)
尝试git blame -C -C b.php
答案 3 :(得分:1)
我对Peter's answer to another question here进行了一些修改,以创建一个名为git-split.sh
的可重用,非交互的shell脚本:
#!/bin/sh
if [[ $# -ne 2 ]] ; then
echo "Usage: git-split.sh original copy"
exit 0
fi
git mv $1 $2
git commit -n -m "Split history $1 to $2"
REV=`git rev-parse HEAD`
git reset --hard HEAD^
git mv $1 temp
git commit -n -m "Split history $1 to $2"
git merge $REV
git commit -a -n -m "Split history $1 to $2"
git mv temp $1
git commit -n -m "Split history $1 to $2"
它只是将源文件复制到一个新文件中,并且两个文件都具有相同的历史记录。可以在that other answer
中看到为什么这样做的解释