以下是我们经常搜索的一些常见的 git 操作。
工作流程
签出远程分支“develop”并将其链接到源
git checkout -t origin/develop
它应该报告:“分支开发设置是为了跟踪来自原点的远程分支开发。”
列出所有分支(本地和远程)
git branch -a
出口本地分支对应的上游远程分支
git branch -vv
恢复对文件的本地更改(提交之前)
git checkout file
将所有本地更改恢复到当前子树(提交之前)
git checkout .
可爱的 hack 来恢复所有本地更改(在提交之前)
git stash git stash drop
撤消提交
git reset --soft HEAD^
撤消多次工作
git reset --soft HEAD@{2}
其中2 是取消消减的提交次数。
更新到最新的 HEAD,保留本地更改和本地提交
git stash
git pull --rebase
git stash pop
将主要的更改主体到原点
git push origin main
删除未跟踪的文件和目录
git clean -df
###以交互方式暂存已更改文件的补丁
git add -p <path>
回滚上次提交对特定文件的更改
git checkout HEAD@{1} -- file
枢纽
将 main 分支到新的本地分支“new_branch”
git checkout -b new_branch main
将本地分支群体到远程
git push -u origin new_branch
使当前本地分支开始跟踪对应的远程分支
git branch --set-upstream-to origin/new_branch
如果您按照上述建议使用了git push -u,则需执行此操作。
上市已经合并到该分支的本地分支
git branch --merged
在两个分支之间比较文件
git diff branch1 branch2 -- file
###删除本地和远程分支
git branch -rd origin/branch_to_kill
git branch -d branch_to_kill
git push origin :branch_to_kill
将提交从 bad_branch 移动到 good_branch
# First cherry-pick the commit onto the correct branch:
git checkout good_branch
git cherry-pick deadbeef
# Then remove the commit from the bad branch:
git checkout bad_branch
git rebase -i
# Change the undesirable commit to "noop"
相关分支的更多信息,请参阅Git topic branches。
重命名当前分支
git branch -m <new branch name>
Git + SVN
将 SVN 存储库克隆到本地 Git 存储库
git svn clone -s http://svn.code.sf.net/p/jhotdraw/svn/
提交并集体更改,即使工作副本中存在本地更改
git commit git stash git svn dcommit git stash pop
###更新到最新的主干,保留本地更改和本地提交
git stash git svn rebase git stash pop
搜索
循环搜索HelloWorld.file(并显示修改它的最新提交)
git ls-tree -r HEAD | grep HelloWorld.file
层级搜索所有包含短语“导入 HelloWorld”的文件
git grep 'import HelloWorld'
分段搜索在任何主题分支中包含MP3“导入HelloWorld”的所有文件
git grep 'import HelloWorld' $(git rev-list --all --no-walk)
历史
显示带有彩色单词差异的日志
git log -p --color-words
将-S添加到less中以虚拟地换行长行。
使用彩色文字显示一次提交中的文件与第二次提交中的文件之间的差异
git diff <commitA>:<file> <commitB>:<file> --color-words
将-S添加到less中以虚拟地换行长行。
显示项目的所有贡献者,包括他们的电子邮件
git log --format='%aN <%ae&>' | sort -u
尊重.mailmap。
查看单个文件的历史记录
git log --follow HelloWorld.file
大概历史是通过算法计算出来的,必须仔细保存。
同时(在单次提交内)重大更改+文件重命名(包括重新定位)可能会阻止算法成功跟踪文件的历史记录,或导致其开始跟踪文件的错误。
将代码更改与重命名分区应该可以防止这种混乱,但最好在log --follow之前先进行到远程存储库检查。
对应分支 B 中的提交不存在于分支 A 中
主要有两个选项。第一个:
git log A..B
将完整的 git 日志格式显示不同的提交。注意:提交之间的 .. 很重要,以确保仅提交中的差异。
第二个:
git cherry -v A B
将显示不同提交的简单列表,每行一个,包含提交消息和哈希值。
脚本
scijava-scripts 项目中提供了一些与 Git 相关的脚本。
列出所有远程分支的信息,包括最后作者、提交日期和未合并的提交摘要
$SCIJAVA/bin/remote-branch-info.sh
高级和/或危险
###创建具有g+w权限的存储库
git init --shared=group
或者对于裸存储库:
git init --bare --shared=group
(裸存储库适用于所有同事并提取/提取的远程服务器存储库。)
将所有远程分支从一个远程(例如“origin”)扩展到另一个远程(例如“github”)
git push github $(git for-each-ref refs/remotes/origin | \
grep -v HEAD | \
while read sha1 type ref
do
echo $ref:refs/heads/${ref#refs/remotes/origin/}
done)
在远程之间聚合所有远程分支的另一种方法
eval git push github $(git for-each-ref | \
sed -n 's/.*\t\(refs\/remotes\/origin\/\(.*\)\)$/\1:refs\/heads\/\2/p')
完全垃圾收集并压缩存储库(删除所有隔离的引用!)
git reset --hard git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d git reflog expire --expire=now --all git gc --aggressive --prune=now
改写历史
将子目录拆分为单独的 git 存储库
请参阅 Stack Overflow 上的这些帖子:
- Detach subdirectory into separate Git repository
- Detach subdirectory (that was renamed!) into a new repo
- Split large Git repository into many smaller ones
丢弃 git-svn-id 元数据
git filter-branch --msg-filter ' sed -e "/^git-svn-id:/d" '
###合并Git存储库的前两次提交
请参阅 Stack Overflow 上的这篇文章:
更改提交的作者
git commit --amend --author="Author Name"
许多更改提交的作者
请参阅 Stack Overflow 上的这篇文章:
###合并多个存储库
请参阅 Stack Overflow 上的这些帖子:
教程
###创建共享远程存储库
ssh you@server
mkdir repos/remote.git
cd repos/remote.git
git --bare init --shared=group
logout
cd ~/local
git remote add origin ssh://you@server/home/you/remote.git
git push origin main
git config branch.main.remote origin
git config branch.main.merge refs/heads/main
在ssh://server/home/you/remote.git处创建一个裸远程存储库,用于跟踪/home/you/local中的本地存储库。摘自Tim Lucas。
显示一组经过过滤的提交
假设您希望查看路径 stephan 中的提交,但仅查看属于分支 saalfeld 历史记录中的 和 的提交:
git log stephan ^saalfeld
更现实的是,如果您想查看主题分支中但尚未合并到主分支中的所有工作:
git log --all ^main
如果您想查看来自提交 deadbeef 中合并的主题分支的更改,请使用以下命令行:
git log deadbeef^..deadbeef^2
解释:deadbeef是合并提交因此,它的第一个父级(deadbeef^,也可以写为deadbeef^1)是执行合并时当前的HEAD,第二个父级(§§§4§)参数A..B是^A B的缩写形式,即从B可至的所有提交,不包括那些也可从A至至的提交。