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 statusgit --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仓库或从新初始化一个现有仓库git add <path>
把path中的文件或者目录添加到暂存区git add ./git add */git add -A
把全部的修改都添加到暂存区中git add -u <path>
git add -i
git clone <版本库的网址>
git clone <版本库的网址> <本地目录名>
git clone --bare
git clone -l
git clone -s
git clone -n
git clone --reference
git clone -o jQuery https://github.com/jquery/jquery.git
克隆远程主机到本地,并将远程主机重命名为jQuery,默认是origingit clone --recursive git@github.com:rbind/yihui.git
克隆库的时候要初始化子模块,加 --recursive 参数git status
显示工做目录和暂存区的状态git status -uno
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 -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
将暂存区里的全部文件恢复到工做树中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 --soft
git reset --keep start
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 <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 -f
git mv -k
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 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 hello
合并hello分支到当前分支Fast-forward信息,Git告诉咱们,此次合并是“快进模式”,也就是直接把master指向dev的当前提交,因此合并速度很是快。这种合并看不出来曾经作过合并。
git merge hello1 hello2
合并hello1和hello2分支的东西到当前分支,多个分支合并。git merge --abort
放弃合并git merge --continue
合并继续,这个命令后是修改合并生成的commit信息git merge -s ours obsolete
git merge --no-ff -m "merge with no-ff" dev
普通模式合并,合并后历史上有分支,能看出来曾经作过合并,表示禁用Fast forward,准备合并dev分支,由于要建立一个新的commit,因此加上-m参数,把commit的表述写进去git mergetool
git设置 mergetool 可视化工具。能够设置BeyondCompare,DiffMerge等做为git的比较和合并的可视化工具,方便操做。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 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 --index
git 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,这会建立一个新的分支,检出你储藏工做时的所处的提交,从新应用你的工做,若是成功,将会丢弃储藏。这是一个很棒的捷径来恢复储藏的工做而后在新的分支上继续当时的工做。
为何有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 -v
查看远程主机的网址git remote show <主机名>
查看主机的详细信息git remote add <主机名> <网址>
添加远程主机git remote rm <主机名>
删除远程主机git remote rename <原主机名> <新主机名>
重命名远程主机一般是将远程主机的版本库有了新的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:branch2jquery
取回远程主机某个分支的更新,再与本地的指定分支合并,它的完整格式稍稍有点复杂。
默认模式下,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 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 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 tagName
看到说明文字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
若是最新一次提交没有注释标签,那么会显示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
git describe --all
git describe --contains
git describe --always
这部分的内容,能够参考以前的文章 包你学会git rebase
git rebase
将合并分支合并到当前分支,并将当前分支的代码合并到后面,获取干净整洁的班版本树git rebase --continue
git遇到冲突会停下要求解决冲突,冲突解决完以后会继续应用(apply)余下的补丁git rebase --skip
跳过当前合并的冲突,进入下一个提交的diffgit rebase --abort
任什么时候候均可以用这个命令终止rebase操做,分支会回到rebase开始的状态通常用于维护和数据恢复。当你在一个仓库下工做时,你的每一步操做都会记录下来,包括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 commitID
能够选择某个分支的一个或几个commit合并到另外一个分支上。假设有一个稳定版本,如今要升级版本,若是将两个版本的分支合并,那么会形成版本混乱,不利于维护,通常会将要增长的功能单独提交一个分支,而后增长到新版本上,就可使用cherry-pick了。记住cherry-pick是一个本地操做。假如你在pull代码以后有人又提交了代码,那么须要先pull代码,再进行cherry-pickgithub