GIT实操手册 —— 值得收藏的GIT常用命令字典

码农天地 -
GIT实操手册 —— 值得收藏的GIT常用命令字典
目录git config 配置git help 显示有关Git的帮助信息git init 初始化git add 将文件内容添加到暂存区git clone 将存储库克隆到新目录中git status 查看状态git diff 显示提交和工作树等之间的更改git commit 提交git reset 将当前HEAD复位到指定状态,用于撤消之前的一些操作git rm 从工作区和暂存区中删除文件git mv 移动或重命名文件,目录或符号链接git branch 列出,创建或删除分支git checkout 切换分支或恢复工作树文件git merge将两个或两个以上的开发历史加入(合并)一起git mergetool 运行合并冲突解决工具来解决合并冲突git log 显示提交日志信息git stash 将更改储藏在脏工作目录中git tag 创建,列出,删除或验证使用GPG签名的标签对象git remote 管理远程主机git fetch 从另一个存储库下载对象和引用git pull 从另一个存储库或本地分支获取并集成(整合)git push 将本地分支的更新,推送到远程主机git submodule 初始化,更新或检查子模块git show 用于显示各种类型的对象git shortlog 汇总git日志输出git describe 显示离当前提交最近的标签git rebase 合并分支git reflog GIT操作历史记录git cherry-pick 摘樱桃模式git config 配置git config --global user.name 'hello' 设置全局用户名hellogit config --global user.email 'hello@zuoyebang.com' 设置全局邮箱hello@zuoyebang.comgit config user.name 查看配置中的配置项(用户名)git config user.email 查看配置中的配置项(邮箱)git config --global core.editor emacs 配置默认的文本编辑器git config --global merge.tool vimdiff 配置比较工具用来解决冲突git config --list 列出Git可以在该处找到的所有的设置git config -–add site.name hello 默认是添加在 local配置中的新配置项git config [--local | --global | --system] –unset site.name 删除配置项中的site.name配置值git config --global alias.别名 命令 给命令设置别名,例如给git status 设置别名为s,git config --global alias.s status

git help 显示有关Git的帮助信息git --help 在git窗口查看命令git help config/git config --help/git --help config 查看git config如何使用git help git/git --help git 显示git手册页git help help/git --help help 查看help命令如何使用git init 初始化git init 创建一个空的Git仓库或重新初始化一个现有仓库git add 将文件内容添加到暂存区git add <path> 把path中的文件或者目录添加到暂存区git add ./git add */git add -A 把所有的修改都添加到暂存区中git add -u <path> git add -igit clone 将存储库克隆到新目录中git clone <版本库的网址>git clone <版本库的网址> <本地目录名>git clone --baregit clone -lgit clone -sgit clone -ngit clone --referencegit clone -o jQuery https://github.com/jquery/jquery.git 克隆远程主机到本地,并将远程主机重命名为jQuery,默认是origingit clone --recursive git@github.com:rbind/yihui.git 克隆库的时候要初始化子模块,加 --recursive 参数git status 查看状态git status 显示工作目录和暂存区的状态git status -unogit diff 显示提交和工作树等之间的更改git diff 是查看working tree与暂存区文件的差异git diff <file> 比较某文件和暂存区文件差异git diff --cached/git diff --staged/ 比较暂存区和上次commit的HEAD的差异git diff HEAD 显示工作版本(Working tree)和上次commit的HEAD的差异git diff HEAD^ HEAD 比较上次提交和上上次提交的差异git diff HEAD -- ./lib 显示当前目录下的lib目录和上次提交之间的差别(更准确的说是在当前分支下)git diff commitID1 commitID2比较两个历史版本之间的差异git diff topic 比较当前分支与topic分支的差别git diff topic dev /git diff topic..dev 在dev和topic两个分支之间比较变更git diff --stat 仅仅比较统计信息(简单结果)git commit 提交git commit 将暂存区中的文件、描述、更改用户、日志消息一起提交到存储库git commit -a/git commit --all 将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。(建议一般不要使用-a参数)git commit -m 'message' /git commit --message 'message' 简要说明提交的信息git commit --amend 追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中git commit -v 查看要提交的内容与版本库中的比较,然后进行提交git reset 将当前HEAD复位到指定状态,用于撤消之前的一些操作git reset 将暂存区里的所有文件恢复到工作树中git reset <path> 将暂存区里的指定文件恢复到工作树中git reset -- README.md 将暂存区的单独一个文件恢复到工作树中。git reset --soft HEAD^ commit之后取消本地提交,回到没有提交之前的暂存区中。git reset --hard commit_id git reset --hard HEAD~3 永久删除最后几个提交git reset --hard ORIG_HEAD 执行git pull完后,发现这次拉取下来的修改不满意,想要回滚到git pull之前的状态,并清空本地没有加入暂存区的内容。git reset --merge ORIG_HEAD 执行git pull完后,发现这次拉取下来的修改不满意,想要回滚到git pull之前的状态,可以避免在回滚时清除工作区,保留暂存区和工作树的内容。git reset --softgit reset --keep start git rm 从工作区和暂存区中删除文件git rm test.txt 删除test.txt文件,并把它从git仓库管理系统中删除,需要执行git commit才能真正提交到git 仓库git rm -r mydir 删除mydir文件夹,并把它从git的仓库管理系统中删除git rm --cache test.txt 从暂存区中移除test.txt文件,对文件本身不进行改变。git rm -f 取消rm操作git mv 移动或重命名文件,目录或符号链接git mv <source> <destination> 例如:git mv test.txt mydir 将test.txt文件移动到mydir目录下git mv test.txt test1.txt 将test.txt文件重命名为test1.txt此操作必须要在暂存区或者文件commit之后才能进行rename,此时不需要再git add, 否则会报错
fatal: not under version control, source=home/test.txt, destination=home/test1.txt )git mv -fgit mv -kgit branch 列出,创建或删除分支git branch 查看本地分支和当前分支git branch test 新建test分支(还在当前分支中)git branch -a 查看本地分支和远程分支git branch -r 查看远程分支git branch -m test test1 修改本地分支名称git branch -d test 删除本地分支git branch -D test 强制删除本地test分支,有时候-d的时候回提示没有完全合并git branch --set-upstream dev origin/test 将本地dev分支与远程主机的test分支建立追踪关系Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。git checkout 切换分支或恢复工作树文件git checkout dev 切换新分支(没有commit的文件会跟随新分支切换)git checkout -b hello 创建并切换到新分支hellogit checkout -B hello 强制创建并切换到新分支,如果当前目录有这个分支,进行覆盖操作git checkout [commitID] 切换到某一个提交版本的分支git checkout --detach hello 切换到hello分支的最后一次提交的commitID版本的分支git checkout --orphan <branch>git checkout --merge <branch>git checkout -p <branch>git checkout <tagName> 切换到tagName标签的分支中git merge 将两个或两个以上的开发历史加入(合并)一起git merge hello 合并hello分支到当前分支Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。这种合并看不出来曾经做过合并。git merge hello1 hello2 合并hello1和hello2分支的东西到当前分支,多个分支合并。git merge --abort 放弃合并git merge --continue 合并继续,这个命令后是修改合并生成的commit信息git merge -s ours obsoletegit merge --no-ff -m "merge with no-ff" dev 普通模式合并,合并后历史上有分支,能看出来曾经做过合并,表示禁用Fast forward,准备合并dev分支,因为要创建一个新的commit,所以加上-m参数,把commit的表述写进去git mergetool 运行合并冲突解决工具来解决合并冲突git mergetool git设置 mergetool 可视化工具。可以设置BeyondCompare,DiffMerge等作为git的比较和合并的可视化工具,方便操作。git log 显示提交日志信息git log 显示提交日志信息git log --no-merges 显示整个提交历史记录,但跳过合并记录git log dev home 显示home子目录中的任何文件的所有提交git log --graph 可以看到分支合并图git log -3 查看最近三次提交git log --author=csf 查看csf作者的提交记录git log --after={2019-03-01}/git log --since={2019-03-01} 查看2018-03-01日之后的提交记录,包括当前日期git log --until={2019-03-01}/git log --before={2019-03-01} 查看2018-03-01日之前的提交记录,不包括当前日期git log --until={2019-03-07} --after={2019-03-05} 查看2018-03-05到2018-03-06两天的提交记录git log commitID 查看包含commitID之前的历史记录*git log commitID1 commitID2 查询commit1与commit2之间的记录,包括commit1和commit2*git log commitID1..commitID2 查询commit1与commit2之间的记录,不包括commit1git log HEAD^ HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,等同于HEAD~1git log HEAD~2 HEAD~2代表倒数第二次提交git log --pretty=oneline 按指定格式显示日志信息(显示一行,可选项有:oneline,short,medium,full,fuller,email,raw以及format:,默认为medium)git log --pretty=oneline --abbrev-commit 按指定格式显示日志信息,显示一行,commitID使用7位数git log --pretty=format:"%an %ae %ad %cn %ce %cd %cr %s" --graph 自定义格式图文形式输出选项说明
%H —— 提交对象(commit)的完整哈希字串
%h —— 提交对象的简短哈希字串
%T —— 树对象(tree)的完整哈希字串
%t —— 树对象的简短哈希字串
%P —— 父对象(parent)的完整哈希字串
%p —— 父对象的简短哈希字串
%an —— 作者(author)的名字
%ae —— 作者的电子邮件地址
%ad —— 作者修订日期(可以用 -date= 选项定制格式)
%ar —— 作者修订日期,按多久以前的方式显示
%cn —— 提交者(committer)的名字
%ce —— 提交者的电子邮件地址
%cd —— 提交日期
%cr —— 提交日期,按多久以前的方式显示
%s —— 提交说明git stash 将更改储藏在脏工作目录中git stash/git stash save 将更改储藏在脏工作目录中(只是会将git跟踪的文件(unstaged changes)和暂存区中的文件(staged changes)进行修改)git stash -u 将更改储藏在脏工作目录中(git跟踪的文件(unstaged changes)、暂存区中的文件(staged changes)、工作目录中的新文件(untracked files))git stash -a/git stash --all 将当前目录的所有文件都进行储藏(git跟踪的文件(unstaged changes)、暂存区中的文件(staged changes)、工作目录中的新文件(untracked files)、被忽略的文件(ignored files))git stash list 查看现有的储藏git stash apply 应用最新一次储藏的内容,不删除赃工作目录git stash apply stash@{2} 应用指定储藏版本的内容git stash apply --indexgit stash drop stash@{0} 删除指定储藏版本的内容,之后的名称1会变成从0开始git stash pop 应用最新一次储藏版本的内容,并将其从堆栈中移走,此时运行git stash list将没有这个储藏的记录git stash show/git stash show stash@{0} 查看最新一个stash的diff统计信息git stash show -p/git stash show -p stash@{0} 查看最新一个stash的展开diffgit stash clear 删除所有缓存的stashgit stash branch testNew 从stash创建分支,如果成功,将会丢弃储藏。如果你储藏了一些工作,暂时不去理会,然后继续在你储藏工作的分支上工作,你在重新应用工作时可能会碰到一些问题。如果尝试应用的变更是针对一个你那之后修改过的文件,你会碰到一个归并冲突并且必须去化解它。如果你想用更方便的方法来重新检验你储藏的变更,你可以运行 git stash branch,这会创建一个新的分支,检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。这是一个很棒的捷径来恢复储藏的工作然后在新的分支上继续当时的工作。git tag 创建,列出,删除或验证使用GPG签名的标签对象为什么有commit还要有tag?因为每次记commitID很复杂,直接找commit对应的有意义的tag,就很好找了。git tag/git tag -l/git tag -l <tagName> 查看所有标签、查看指定标签git tag <name> 当前分支的最新HEAD打新标签git tag <name> <commitID> 给对应的某个commitID打标签git tag <name>-light 创建轻量标签git tag -a <name> -m "message" 创建带有说明的标签,即注释标签,用-a指定标签名,-m指定说明文字git tag -d <name> 删除本地标签git tag start ?git remote 管理远程主机git remote 列出所有远程主机git remote -v 查看远程主机的网址git remote show <主机名> 查看主机的详细信息git remote add <主机名> <网址> 添加远程主机git remote rm <主机名> 删除远程主机git remote rename <原主机名> <新主机名> 重命名远程主机git fetch 从另一个存储库下载对象和引用通常是将远程主机的版本库有了新的commit的时候,将这些更新取回本地,这个命令通常用来查看其他人的进程,因为它取回的代码对本地的开发代码没有影响。
可以使用git merge和git rebase命令,在本地分支合并远程分支。
这个命令主要是在合并之前可以看看有哪些地方进行了修改git fetch <远程主机名> 将远程主机的更新全部取回本地,默认是所有分支的更新git fetch <远程主机名><分支名> 取回远程主机中的特定分支的更新(git fetch origin dev)*git fetch origin branch1:branch2 首先执行上面的fetch操作,使用远程branch1分支在本地创建branch2(但不会切换到该分支),如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,如果本地存在branch2分支, 并且是`fast forward', 则自动合并两个分支, 否则, 会阻止以上操作.

git fetch origin :branch2
等价于: git fetch origin master:branch2

git pull 从另一个存储库或本地分支获取并集成(整合)取回远程主机某个分支的更新,再与本地的指定分支合并,它的完整格式稍稍有点复杂。
默认模式下,git pull 是git fetch 和git merge FETCH_HEAD的缩写git pull <远程主机名> 将远程主机的全部分支取回并与本地分支合并,如果当前分支和远程分支有追踪关系,git pull就可以省略远程分支名。git pull <远程主机名><远程分支名> 将远程主机的某一个分支取回和本地当前分支合并git pull <远程主机名><远程分支名>:<本地分支名> 将远程的某一分支取回和本地某一分支进行合并(git pull dev:test)git pull --rebase <远程主机名><远程分支名>:<本地分支名> 将远程某一分支取回和本地某个分支进行rebase合并,不写默认是merge*git pull -p 如果远程主机删除了某个分支,就会在本地删除远程已经删除的分支 (等同git fetch --prune origin → git fetch -p)git push 将本地分支的更新,推送到远程主机git push 如果远程主机和当先分支有追踪关系,那么主机名可以忽略,默认是将所有的分支都取回git push <远程主机名><远程分支名>:<本地分支名> 将本地某一分支推送到远程主机的某一分支上git push origin 如果远程主机和当先分支有追踪关系,将本地当前分支推送到origin远程主机的对应分支
git push origin test 将本地的当前分支推送到远程主机的test分支,如果test分支不存在,则会被新建
git push origin test:test1 将本地的test分支推送到origin远程主机的test1分支上git push <远程主机名> --delete <远程分支名> / git push <远程主机名> :<远程分支名> 删除远程某一分支(第二种相当于推送一个空的本地分支到远程分支,也是删除远程分支的)git push origin --delete test /git push origin :test 删除远程test分支git push --all origin 将所有本地分支都推送到origin远程主机(当远程主机的版本bii本地版本更新的时候,推送时git会报错,要求先在本地做git pull合并差异)git push --force origin/git push -f origin 将本地分支强推送到origin远程主机,结果导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge)。除非你很确定要这样做,否则应该尽量避免使用–-force选项。git push -f origin dev:student 将本地的dev分支强覆盖origin远程主机的远程student分支git push -u origin master 如果当前分支与多个主机存在追踪关系,使用-u指定一个默认主机,这样就可以不加任何参数的使用git push(这个是指定了origin主机的master为默认选项)git push origin <tagName> 推送某个标签到远程分支git push origin --tags 一次性推送全部尚未推送到远程的本地标签git push origin :<tagname> / git push origin :refs/tags/<tagname> 删除一个远程标签git submodule 初始化,更新或检查子模块git submodule add http://github.com/chaconinc/DbConnector 添加一个名为 “DbConnector” 的库。默认情况下,子模块会将子项目放到一个与仓库同名的目录中,如果你想要放到其他地方,看下面。git submodule add <版本库的网址> <本地目录名> 把某版本库添加到本地的某个目录中。git submodule update --init --recursive 已经克隆了主库但没初始化子模块git submodule update --recursive --remote 已经克隆并初始化子模块,而需要从子模块的源更新这个子模块.更新之后主库的,git 差异中会显示新的 SHA 码,把这个差异选中提交即可。git submodule 查看子模块git submodule update 更新项目内子模块到最新版本git submodule update --remote 更新子模块为远程项目的最新版本git submodule init 初始化子模块git show 用于显示各种类型的对象git show tagName 看到说明文字git shortlog 汇总git日志输出git shortlog 汇总每个人的commit记录,进行简单输出git shortlog -s 参数省略每次 commit 的注释,仅仅返回一个简单的统计。git shortlog -n 参数按照 commit 数量从多到少的顺利对用户进行排序git shortlog -sn/git shortlog -s -n 按照commit的数量从多到少进行排序,并简单的统计数量。git shortlog -2 查看最近两次的commit记录git describe 显示离当前提交最近的标签该命令查找从提交可访问的最新标记。如果标签指向提交,则只显示标签。
否则,它将标记 名称与标记对象之上的其他提交数量 以及 最近提交的缩写对象名称后缀git describe 如果最新一次提交没有注释标签,那么会显示fatal: No annotated tags can describe 'daa38004d76012c77029727096b9e4ef724030a7'.
However, there were unannotated tags: try --tags.git describe --tags 显示离当前提交最近的标签,不限于只是注释标签, 如果tag之后没有提交,就只显示名字,如果之后有提交,就显示下面的

merge1this-1-g84a2cd7说明:

"最新一次tagName""打tagName以来有两次提交commit""最新一个g+commitID" ,g表示git
如果之后没有提交,后面两个参数不会写。

git describe --allgit describe --containsgit describe --alwaysgit rebase 合并分支这部分的内容,可以参考之前的文章 包你学会git rebasegit rebase 将合并分支合并到当前分支,并将当前分支的代码合并到后面,获取干净整洁的班版本树git rebase --continue git遇到冲突会停下要求解决冲突,冲突解决完之后会继续应用(apply)余下的补丁git rebase --skip 跳过当前合并的冲突,进入下一个提交的diffgit rebase --abort 任何时候都可以用这个命令终止rebase操作,分支会回到rebase开始的状态git reflog GIT操作历史记录一般用于维护和数据恢复。当你在一个仓库下工作时,你的每一步操作都会记录下来,包括checkout,rebase,merge,commit操作。所以这个也是一个很好的回滚方式。git reflog / git reflog show 显示所有的git操作历史记录

git reflog dev 显示在dev分支上面的操作历史记录 git reset --hard git@{1} 回滚到那个位置git reflog --date=local | grep merge1 根据本地时间查看merge1分支的git操作记录

git reflog delete HEAD@{1} 删除对应步骤的git操作历史记录git cherry-pick 摘樱桃模式git cherry-pick commitID 可以选择某个分支的一个或几个commit合并到另一个分支上。假设有一个稳定版本,现在要升级版本,如果将两个版本的分支合并,那么会造成版本混乱,不利于维护,一般会将要增加的功能单独提交一个分支,然后增加到新版本上,就可以使用cherry-pick了。

记住cherry-pick是一个本地操作。假如你在pull代码之后有人又提交了代码,那么需要先pull代码,再进行cherry-pick

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

加个好友,技术交流

1628738909466805.jpg