我有一个分支A,想要列出一个非常重要的变化列表。这些更改的最终结果已存在于目录B中,我也希望成为新的工作副本。在本质上,我只想"使这个目录成为我的分支的最新工作副本。"
我目前有两种可能的方法来实现这一目标:
这两个解决方案的问题,除了可怕的笨重之外,是它们需要磁盘空间用于目录B和C.选项1还涉及更多的文件洗牌。所以目前我最好的解决方案是选项2,详细步骤如下。
我想有一个更好的方法来使用" reset"或" symbolic-ref"。我尝试了各种选择但没有成功。
mkdir /tmp/git_output
cd /tmp/git_output
git init
git remote add origin /path_or_url_to/git/repo.git
git fetch
git checkout name_of_branch
mv .git /path/to/new/src/
cd /path/to/new/src/
git commit -a
git push
rm -rf /tmp/git_output
感谢您的帮助。
答案 0 :(得分:1)
我认为应该可以删除工作副本中的所有内容(确保三倍确定不删除.git
文件夹 - 进行备份!)。然后,复制目录B
,git add -u
的内容(取决于您的Git的反面),从索引中删除丢失的文件,并将新文件添加到索引中。承诺。快乐。
我能想到的另一种方法是在目录B
中初始化一个新的Git存储库,提交所有文件,然后推送到A:cd B; git init; git add .; git commit -m 'complete rewrite'; git push /path/to/A HEAD:rewrite
。
现在,在A
中,创建一个移植,告诉Git,分支rewrite
的提示将master
的分支A
作为其父级。然后运行git filter-branch
使该移植物永久化。
答案 1 :(得分:0)
git checkout A
GIT_WORK_TREE=path/to/B git add -An . # take out the `n` to actually do it
git commit
git checkout as-you-were
(编辑:如果您已经在分支A上,那么您需要在完成工作树后刷新git reset --hard
。)
如果你想要更低级别的话,你可以在没有结账的情况下做到这一点:
(
export GIT_INDEX_FILE=.git/sideband-index
export GIT_WORK_TREE=path/to/B
cp .git/HEAD{,~}
git symbolic-ref HEAD refs/heads/A
git add -A .
git commit
mv .git/HEAD{~,}
)
甚至
(
export GIT_INDEX_FILE=`mktemp -u`
export GIT_WORK_TREE=path/to/B
git add -A .
git update-ref A $(git commit-tree -m 'hi there!' -p A $(git write-tree))
)