常用git命令

  • Post author:
  • Post category:其他




0.git占位符

H :提交哈希

%h :缩写提交哈希

%T :树形哈希

%t :缩写树哈希

%P :父哈希

%p :缩写为父哈希值

%和:作者姓名

%aN :作者姓名(尊重.mailmap,见 git-shortlog [1] 或 git-blame [1] )

%ae :作者电邮

%aE :作者电子邮件(尊重.mailmap,见 git-shortlog [1] 或 git-blame [1] )

%ad :作者日期(格式尊重 - 日期=选项)

%aD :作者日期,RFC2822风格

%ar :作者日期,相对

的%:作者日期,UNIX时间戳

%ai :作者日期,ISO 8601样格式

%aI :作者日期,严格的ISO 8601格式

%cn :提交者名称

%cN :提交者名称(尊重.mailmap,见 git-shortlog [1] 或 git-blame [1] )

%ce :提交者电子邮件

%cE :提交者电子邮件(尊重.mailmap,参见 git-shortlog [1] 或 git-blame [1] )

%cd :提交者日期(格式尊重 - 日期=选项)

%cD :提交者日期,RFC2822样式

%cr :提交者日期,相对

%ct :提交者日期,UNIX时间戳

%ci :提交者日期,类似ISO 8601的格式

%cI :提交者日期,严格的ISO 8601格式

%d :引用名称,如 git-log [1] 的—decorate选项

%D :没有“(”,“)”包装的引用名称。

%S :在达到提交的命令行上给出的引用名称(如git log --source),仅适用于git log

%e :编码

%s :受试者

%f :已清理的主题行,适用于文件名

%b :身体

%B :生体(未包裹的主体和身体)

%N :提交备注

%GG :来自GPG的签名提交的原始验证消息

%G? :显示好的(有效)签名“G”,坏签名显示“B”,有效期未知的好签名显示“U”,已过期的好签名显示“X”,“Y”代表由过期密钥签名的好签名,“R”表示由撤销密钥签名的好签名,“E”表示签名无法检查(例如缺少密钥),“N”表示没有签名

%GS :显示签名提交的签名者姓名

%GK :显示用于签署签名提交的密钥

%GF ​​:显示用于签署签名提交的密钥的指纹

%GP :显示主键的指纹,其子键用于签名提交的签名

%gD :reflog选择器,例如refs/stash@{1}或refs/stash@{2 minutes ago};格式遵循-g选项描述的规则。 @之前的部分是命令行中给出的refname(因此git log -g refs/heads/master将产生refs/heads/master@{0})。

%gd :缩短了reflog选择器;%gD相同,但refname部分缩短了人类的可读性(因此refs/heads/master变为master)。

%gn :reflog身份名称

%gN :reflog身份名称(尊重.mailmap,见 git-shortlog [1] 或 git-blame [1] )

%ge :reflog身份电子邮件

%gE :reflog身份邮件(尊重.mailmap,见 git-shortlog [1] 或 git-blame [1] )

%gs :reflog主题

%Cred :将颜色切换为红色

%Cgreen :将颜色切换为绿色

%Cblue :将颜色切换为蓝色

%Creset :重置颜色

%C(…):颜色规格,如 git-config [1] 的“CONFIGURATION FILE”部分中的值所述。默认情况下,仅在启用日志输出时显示颜色(通过color.diff,color.ui或--color,并且如果我们要去终端,则尊重前者的auto设置)。 %C(auto,...)被接受为默认的历史同义词(例如,%C(auto,red))。即使没有启用颜色,指定%C(always,...)也会显示颜色(尽管只考虑使用--color=always为整个输出启用颜色,包括这种格式和其他任何git可能颜色的颜色)。单独auto(即%C(auto))将打开下一个占位符的自动着色,直到再次切换颜色。

%m :左(<),右(>)或边界(-)标记

%n :换行符

%% :原始%

%x00 :从十六进制代码打印一个字节

%w([< w> [< i1> [< i2>]]]):切换行换行,类似 git-shortlog [1]-w选项。

%<< N> [,trunc | ltrunc | mtrunc]):使下一个占位符至少取N列,如果需要,在右边填充空格。如果输出长于N列,则可以选择在开头(ltrunc),中间(mtrunc)或结尾(trunc)截断。请注意,截断仅适用于N> = 2。

%< |< N>):使下一个占位符至少占用第N列,如果需要,在右边填充空格

%>< N>),%> |< N>):与%相似,%< |< N>),但左边的填充空格

%>< N>),%> |< N>):类似于%>< N>分别是,%> |< N>),除非下一个占位符占用的空间多于给定的空间并且左侧有空格,请使用这些空格

%><< N>),%>< |< N>):类似于%<< N> ),%< |< N>),但填充两侧(即文本居中)

%(预告片[:options]):显示 git-interpret-trailers [1] 解释的正文预告片。 trailers字符串后面可以跟冒号和零个或多个逗号分隔选项。如果给出了only选项,则省略拖车块中的非拖车线。如果给出unfold选项,则表现得就像给出了interpre-trailer的--unfold选项一样。例如,%(trailers:only,unfold)两者都做。



1.创建新分支



1.1从当前分支创建新分支
git checkout -b decard_feature_v3_ui_adjustment


1.2从远程分支创建新分支
git checkout -b localbranch origin/remotebranch


1.3从某个commitId创建新分支
git checkout commitId -b newbranchName



2.将本地新创建分支推送至服务器

git push --set-upstream origin decard_feature_v3_ui_adjustment



3.放弃本地修改(对没有add或commit的修改,是不可恢复的,慎用)

git reset --hard



4.合并dev分支到master

git checkout master
git merger dev



5.删除分支

//删除远程分支
git push origin --delete dev
//删除本地分支
git branch -d dev
//重命名本地分支
git branch -m oldBranchName newBranchName



6.查看已经commit但是没有push的记录

git cherry -v



7.查看所有分支已经commit但是没有push的记录

//查看尚未推送的所有分支上的所有提交
git log --branches --not --remotes
//查看所有分支上的未推送的最新提交以及分支名称
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline --date=relative
//查看所有分支上的未推送的提交以及分支名称
git log --branches --not --remotes --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit --date=iso8601-strict
//上面的命令太长,配置一个简写的命令,all-not-push
git config --global alias.anp "log --branches --not --remotes --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit --date=iso8601-strict"



7.显示最后一次的文件改变的具体内容

git show



8.每次修改的文件列表

git whatchanged
git whatchanged --stat 以及文件修改的统计
//查看每次提交修改了哪些文件
git whatchanged --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ai) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
//命令太长,添加自定义命令
git config --global alias.whatched  "whatchanged --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ai) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"



9.查看修改内容

git diff



10.重命名远程分支对应的本地分支

git branch -m oldName newName



11.查看某次commit具体修改内容,查看某次commit中某个文件的修改内容

git show commitid
//filename,是项目中的全路径
git show commitId fileName



12.暂时保存不想add和commit的内容

git stash save "change message"//会缓存添加到暂存区的修改,Git跟踪的但并未添加到暂存区的修改,不会缓存在工作目录中新的文件(untracked files),被忽略的文件
使用-u或者--include-untracked可以stash untracked文件
使用-a或者--all命令可以stash当前目录下的所有修改
git stash save -u "change message"



13.查看现有的stash

git stash list



14.重新应用缓存的stash

git stash pop//将缓存堆栈中的第一个stash删除,并将修改应用到当前的工作目录下
git stash apply//缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝



15.删除stash

git stash drop stashname



16.将某个commit合并到其它分支



git cherry-pick [<options>] <commit-ish>...

常用options:
    --quit                退出当前的chery-pick序列
    --continue            继续当前的chery-pick序列
    --abort               取消当前的chery-pick序列,恢复当前分支
    -n, --no-commit       不自动提交
    -e, --edit            编辑提交信息
        
这时如果要继续cherry-pick,则首先需要解决冲突,通过git add .将文件标记为已解决,然后可以使用git cherry-pick --continue命令,继续进行cherry-pick操作。
 
如果要中断这次cherry-pick,则使用git cherry-pick --quit,这种情况下当前分支中未冲突的内容状态将为modified
        
如果要取消这次cherry-pick,则使用git cherry-pick --abort,这种情况下当前分支恢复到cherry-pick前的状态,没有改变。



17.合并commit

git rebase -i [commitId] // 这里跟的 commitId是不会被干掉的。
git rebase -i HEAD~3 //从HEAD版本开始往过去数3个版本
    
pick b59c48c fix bug
pick 1a76bac test 3

# Rebase a665822..1a76bac onto a665822 (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit

上面的界面,先列出当前分支最新的 2 个 commit (越下面越新)。每个 commit 前面有一个操作命令,默认是 pick ,表示该行 commit 被选中,要进行 rebase 操作。2 个 commit 的下面是一大堆注释,列出可以使用的命令。

squash 和 fixup 都可以用来合并 commit ,唯一的区别是 squash 会把 commit message 也合并,而 fixup 只会留下最新的一条 commit message, 现在我们先把需要合并的 commit 前面的动词,改成 fixup (或者 f),然后就是 :wq 保存吧。

保存完成之后,你有两个选择
git rebase --continue  //确认 rebase
git rebase --abort //取消 rebase



18.修改commit message

修改最后一次commit message

# 修改最近提交的 commit 信息
$ git commit --amend --message="modify message by daodaotest" --author="jiangliheng <jiang_liheng@163.com>"

# 仅修改 message 信息
$ git commit --amend --message="modify message by daodaotest"

# 仅修改 author 信息
$ git commit --amend --author="jiangliheng <jiang_liheng@163.com>"

修改历史提交 commit 的信息

操作步骤:

git rebase -i 列出 commit 列表
找到需要修改的 commit 记录,把 pick 修改为 edit 或 e,:wq 保存退出
修改 commit 的具体信息git commit --amend,保存并继续下一条git rebase --continue,直到全部完成
中间也可跳过或退出git rebase (--skip | --abort)



19.终极恢复

无论是做了rebase,还是reset等操作,即使错了,也不要慌,可以恢复原样

#记录所有操作,前提是此操作不能太过久远,本地会删除一些较久远的操作记录
git reflog



20.新建tag

//在当前commit上打tag,不需要备注
git tag v1.0
//在当前commit上打tag,需要备注
 git tag -a v1.0 -m "这是我打的tag"
 //在指定commit上打tag
  git tag -a v1.0 commitId -m "这是我在指定commitId上打的tag" 



21.查看tag

//只能查看tag名
git tag
//可以查看tag名和注释
 git tag -n
//查看tag详细信息
 git show tagName



22.同步tag到服务器

//推送单个tag到服务端
git push origin v1.0
//推送所有tag
 git push origin --tags



23.删除tag

//删除本地
git tag -d v1.0
//删除远端tag
 git push origin :refs/tags/v1.0



24.切换到某个tag

git checkout v1.0



25.查看好看的log,自定义log

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
//命令太长,可以自定义命令为git lg,直接输入git lg就等价于上面很长的命令
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"



26.查看某个文件的提交记录

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative filename



27.查看某个文件每次提交的diff

git log -p filename



28.查看本地分支与远程分支的映射关系

git branch -vv



29.撤销本地分支与远程分支的映射关系

git branch --unset-upstream



30.建立本地分支与远程分支的映射关系

git branch --set-upstream-to origin/addFile



31.将本地修改推送至远程分支

git pull --rebase //防止直接git pull 会产生很多不必要的merge记录
git push origin remotebranch



32.从某次commitId之前插入代码修改bug

1.我以前提交的代码出现了bug,所以要退回当初提交的commitId区修复bug
举个栗子,当前的git树
A---B---C---D---E
                ^
              master
              
C节点出现了bug,我要退回C节点,修复bug,修复后的git树如下
A---B---C---C1---C2---D---E
                          ^
                        master
操作如下:
1.C节点切分支:git checkout cCommitId -b bugfix
2.在bugfix分支commit C1,C2
3.切换回master分支:git checkout master
4.利用变基参数:git rebase --onto bugfix cCommitId
5.此时可能会存在冲突,按照提示解决冲突,先git add conflictFiles,然后再git rebase --continue。千万不要在git add 后执行git commit 要不然 git树会分叉。
6.下图是解决后的git树,完美。

在这里插入图片描述



33.clone某个分支,而不是整个仓库

git clone -b branchName xxx.git



版权声明:本文为baidu_17508977原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。