HEAD 表示当前版本
HEAD^ 上一个版本
HEAD^^ 上上一个版本
HEAD^^^ 上上上一个版本
以此类推...
可以使用 ~数字表示:
HEAD~0 表示当前版本
HEAD~1 上一个版本
HEAD^2 上上一个版本
HEAD^3 上上上一个版本
以此类推...
查看所有的配置以及它们所在的文件:
git config --list --show-origin
设置你的用户名和邮件地址:
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。
配置Git默认文本编辑器:
git config --global core.editor "'D:\tool\EditPlus\editplus.exe'"
检查你的配置:
git config --list
检查 Git 的某一项配置:
git config
检查Git的某一项配置同时知道它从哪个文件来:
git config --show-origin
Git别名:
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit # 当要输入 git commit 时,只需要输入 git ci
$ git config --global alias.st status
$ git config --global alias.cam "commit -a -m" # 输入git commit -a -m "提交信息"的时候,只需要输入git cam "提交信息"
获取Git命令帮助:
git help
git --help
man git-
不需要全面的手册,只需要可用选项的快速参考:
git add -h # 查看 git add 的可用选项快速参考
在已存在目录中初始化仓库:
git init
克隆现有的仓库:
git clone https://github.com/libgit2/libgit2
克隆远程仓库的时候,自定义本地仓库的名字:
git clone https://github.com/libgit2/libgit2 mylibgit
检查当前文件状态:
git status
状态简览:
git status -s
最常用可可能是下边几个命令:
git add filename # 提交filename到数据暂存区,filename可使用通配符
git add . # 提交所有修改的和新建的数据暂存区; 但是某个版本后也会添加删除的文件到暂存区了.
git add -u # 提交所有被删除和修改的文件到数据暂存区
git add -a # 是上面两个功能的合集,提交所有被删除、被替换、被修改和新增的文件到数据暂存区
跟踪部分文件,例如.java结尾的:
git add *.java
交互式暂存:
git add -i
git add -i的交互式暂存可以参考这里
查看工作目录中当前文件和暂存区域快照之间的差异:
git diff
查看已暂存文件与最后一次提交的文件差异:
git diff --staged
等价于
git diff --cached
暂存区的提交:
git commit # 这样会启动你选择的文本编辑器来输入提交说明
提交的同时输入提交信息:
git commit -m "提交信息说明"
跳过使用暂存区域:
git commit -a -m "提交信息说明" # Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
提交(commit)完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交:
git commit --amend
删除文件的同时添加到暂存区:
git rm test.txt # 相当于本地rm文件test.txt,然后执行git add命令。
删除Git仓库(亦即从暂存区域移除)中的文件,但仍然希望保留在当前工作目录中:
git rm --cached test.txt
会删除暂存区中的文件,但是会保留工作区中的文件,并将此次删除提交到暂存区。--cached 参数 删除的文件必须是已经被追踪的文件,即之前被版本控制的文件。
要在 Git 中对文件改名:
git mv file_from file_to
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
按时间先后顺序列出所有的提交,最近的更新排在最上面:
git log # 这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
显示每次提交所引入的差异(按 补丁 的格式输出):
git log -p -2 # 使用 -2 选项来只显示最近的两次提交
查看每次提交的简略统计信息:
git log --stat
使用不同于默认格式的方式展示提交历史:
git log --pretty=
oneline 会将每个提交放在一行显示:
git log --pretty=oneline
Git 可以为 SHA-1 值生成出简短且唯一的缩写。 如果你在 git log 后加上 --abbrev-commit 参数,输出结果里就会显示简短且唯一的值:
git log --abbrev-commit --pretty=oneline
format 定制记录的显示格式:
git log --pretty=format:"%h - %an, %ar : %s"
format常用选项参考这里。
查看各个分支当前所指的对象:
git log --oneline --decorate
ASCII 字符串来形象地展示你的分支、合并历史:
git log --pretty=format:"%h %s" --graph
git log 的常用选项参考这里。
按照时间作限制的选项,列出最近两周的所有提交:
git log --since=2.weeks
查看2022-11-15号到现在的所有提交:
git log --since="2022-11-15"
查看分叉历史:
git log --oneline --decorate --graph --all
查看 dev分支中还有哪些提交尚未被合并入 master 分支:
git log master..dev # 反过来,如果你想查看在 master 分支中而不在 dev分支中的提交,你只要交换分支名即可。
看你即将推送到远端的内容:
$ git log origin/master..HEAD # 这个命令会输出在你当前分支中而不在远程 origin 中的提交。
等价于
git log origin/master..
查看哪些提交是被包含在某些分支中的一个,但是不在你当前的分支上:
$ git log refA..refB #
等价于
$ git log ^refA refB
等价于
$ git log refB --not refA
想查看所有被 refA 或 refB 包含的但是不被 refC 包含的提交:
$ git log refA refB ^refC
等价于
$ git log refA refB --not refC
选择出被两个引用 之一 包含但又不被两者同时包含的提交, 例如想看 master 或者 dev中包含的但不是两者共有的提交,你可以执行:
$ git log master...dev
$ git log --left-right master...dev # 显示每个提交到底处于哪一侧的分支。
当你在工作时, Git 会在后台保存一个引用日志(reflog), 引用日志记录了最近几个月你的 HEAD 和分支引用所指向的历史:
git reflog
取消暂存的文件:
git restore --staged ...
撤消对文件的修改(已跟踪修改但还未添加到暂存区):
git restore ...
查看你已经配置的远程仓库服务器:
git remote # 它会列出你指定的每一个远程服务器的简写
指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL:
git remote -v
添加一个新的远程 Git 仓库,同时指定一个方便使用的简写:
git remote add pb https://github.com/paulboone/ticgit # 指定了简写pb,而不是默认的origin, 可以在命令行中使用字符串 pb 来代替整个 URL
查看某一个远程仓库的更多信息:
git remote show # 可以通过git remote查看
远程仓库的重命名:
git remote rename pb paul # 改一个远程仓库的简写名,将 pb 重命名为 paul
删除一个添加的远程地址:
git remote remove paul # 所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除
从远程仓库中获得数据:
git fetch # remote可以通过 git remote查看
git fetch 命令只会将数据下载到你的本地仓库(区分开本地仓库、暂存区和工作空间的概念)——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
例如:
git fetch origin # 获取了远程分支serverfix到本地仓库中了
这种情况下,不会有一个新的 serverfix 分支——只有一个不可以修改的 origin/serverfix 指针指向服务器的 serverfix 分支的引用。可以运行 git merge origin/serverfix 将这些工作合并到当前所在的分支。 但是如果本地还没有serverfix分支,可以执行git checkout -b serverfix origin/serverfix命令,结合 git checkout命令。
显式地推送想要分享的分支:
git push
例如:
git push origin serverfix # 这里有些工作被简化了。 Git 自动将 serverfix 分支名字展开为 refs/heads/serverfix:refs/heads/serverfix, 那意味着,“推送本地的 serverfix 分支来更新远程仓库上的 serverfix 分支。”
等价于
git push origin serverfix:serverfix
推送本地分支到一个命名不相同的远程分支:
git push origin serverfix:awesomebranch # 来将本地的 serverfix 分支推送到远程仓库上的 awesomebranch 分支
删除远程分支:
git push --delete
等价于
git push -d
列出已有的标签:
git tag # 可带上可选的 -l 选项 --list
按照特定的模式查找标签,例如只对 1.8.5 系列感兴趣:
git tag -l "v1.8.5*"
创建附注标签:
git tag -a -m "标签信息" # -m 选项指定了一条将会存储在标签中的信息
查看标签信息和与之对应的提交信息查看git show命令。
创建轻量标签:
git tag
后期打标签:
git tag -a 9fceb02 # 指定分支的校验和9fceb02
送标签到远程仓库服务器上:
git push origin
一次性推送很多标签到远程仓库服务器上:
git push origin --tags
删除掉你本地仓库上的标签:
git tag -d
删除远程仓库中的标签:
git push :refs/tags/
等价于
git push --delete
等价于
git push -d
查看标签信息和与之对应的提交信息:
git show # 输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息
git show 的检视某次的提交(假设简短的版本没有歧义)
$ git show 1c002dd4b536e7479fe34593e72e6c6c1819e53b
等价于
$ git show 1c002dd4b536e7479f
等价于
$ git show 1c002d
查看本地已经存在的分支:
git branch # 当前分支的前面加*号标记
查看远程的分支:
git branch -r
查看所有分支包括本地和远程:
git branch -a
查看每一个分支的最后一次提交:
git branch -v
重命名分支:
git branch -m
git branch -M # 如果newbranch名字分支已经存在,则需要使用-M强制重命名
–merged 与 --no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。要查看哪些分支已经合并到当前分支:
git branch --merged
查看存在但是尚未合并到当前分支的分支:
git branch --no-merged
创建一个新的本地分支,但是不会进行切换:
git branch # 创建的同时切换 => git checkout -b
删除指定的本地分支:
git branch -d
git branch -D # 删除分支时如果此分支包含了未合并的工作,删除会失败,可以尝试使用-D命令; 否则使用 -d
删除指定的远程分支:
git branch -d -r
设置已有的本地分支跟踪一个刚刚拉取下来的远程分支或者想要修改正在跟踪的上游分支:
git branch -u / # 创建了一个本地分支,git fetch拉取远程分支,然后建立本地分支和远程某个分支的跟踪关系
将本地分支与远程分支建立连接:
git branch --set-upstream-to=origin/
查看设置的所有跟踪分支:
git branch -vv # 将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有
要切换到一个已存在的分支:
git checkout
创建新分支的同时切换过去:
git checkout -b
等价于
git branch
git checkout
如果git fetch
git checkout -b serverfix origin/serverfix # 也就是本地创建一个serverfix分支,跟踪远程origin/serverfix分支
等价于
git checkout --track origin/serverfix
等价于
git checkout serverfix # 本地正好有一个与远程分支相同的匹配,而且你已经执行了git fetch
想要将本地分支与远程分支设置为不同的名字:
git checkout -b /
合并两个分支,例如将 hotfix 分支合并回 master 分支:
git checkout master # 首先确保你在master分支上
git merge hotfix # 将hotfix分支合并到当前master分支上
merge冲突的时候使用图形化工具来解决冲突:
git mergetool
自动地识别去哪个服务器上抓取、合并到哪个分支:
git pull
等价于
git fetch
git merge origin/ # 前提是建立在远程跟踪分支之上
结合git fetch 和 git checkout命令。
例如可以检出 experiment 分支,然后将它变基到 master 分支上:
git checkout experiment
git rebase master
修改提交信息:
git rebase -i
具体修改提交信息参考Pro Git日常学习记录-Git工具-19.重写历史
存储当前分支下的所有改动:
git stash # 保存当前未commit的代码,会有默认的贮藏注释
git stash -m "xxxx" # 保存当前未commit的代码的同时添加自定义注释
git stash save "xxxx" # 保存当前未commit的代码并添加备注
查看所有的存储列表:
git stash list # 展示的列表第一个是最新的
应用最近一次的stash,随后删除该记录:
git stash pop # 此次恢复之后的文件状态都是未暂存的, 即使你stash之前add过了
git stash pop stash@{1} # 当有多条 stash,可以指定操作stash,这里是应用第二条数据并删除贮藏, apply和drop同理
应用最近一次的stash,但不删除这个贮藏:
git stash apply stash@{0} # 该贮藏的内容还是存储在栈内, git stash list可以看到
恢复最近的一次贮藏,但不删除这个贮藏:
git stash apply
git stash apply stash@{1} # 当有多条 stash,可以指定操作stash, 这里是应用第二条记录, pop,drop 同理
恢复贮藏的同时,恢复贮藏前的跟踪状态:
git stash apply --index
git stash apply stash@{1} --index
如果不加–index,恢复的贮藏文件,都会是未跟踪的状态,不管你贮藏前是否加入了暂存区;所以恢复贮藏的同时恢复文件的跟踪状态,需要添加 --index
贮藏指定的文件:
git stash push test.txt # 只是贮藏了test.txt文件
查看某次贮藏修改了哪些文件:
git stash show stash@{1}
git stash show
等价于
git stash show stash@{0}
删除最近的一次stash:
git stash drop
从堆栈中删除某次的贮藏:
git stash drop stash@{1}
删除stash的所有记录:
git stash clear
从最新的stash创建分支:
git stash branch
应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决stash中的内容和当前目录的内容发生冲突的情景。发生冲突时,需手动解决冲突。
git reset [--soft | --mixed | --hard] [HEAD] # --mixed为默认,可以不携带此参数
git reset --mixed [HEAD] # 用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
等价于
git reset [HEAD]
git reset --soft HEAD # --soft 参数用于回退到某个版本
git reset --hard HEAD # --hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
实例:
$ git reset HEAD^ # 回退所有内容到上一个版本
$ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
$ git reset 052e # 回退到指定版本
$ git reset --soft HEAD~3 # 回退上上上一个版本
$ git reset --hard HEAD~3 # 回退上上上一个版本
$ git reset --hard bae128 # 回退到某个版本回退点之前的所有信息。
$ git reset --hard origin/master # 将本地的状态回退到和远程的一样
git clean命令用来从你的工作目录中删除所有没有tracked过的文件。
演习删除,告诉你哪些文件或文件夹会被删除(没有真正的删除):
git clean -n # 哪些文件会被删除
等价于
git clean -n -f
等价于
git clean -nf
git clean -n -d # 哪些文件和文件夹会被删除
这些操作演习删除不包含.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过
删除指定路径下的没有被track过的指定文件:
git clean -f # 删除指定路径下的没有被track过的文件
删除当前目录下所有没有track过的文件:
git clean -f # 不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过
删除指定路径下的没有被track过的文件文件夹:
git clean -f -d # 删除当前目录下没有被track过的文件和文件夹
等价于
git clean -df # 这两个等价命令不会删除.gitignore中忽略的文件和文件夹
删除包括.gitignore的文件和文件夹:
git clean -f -x # 删除当前目录下所有没有track过的文件, 包含.gitignore中的文件
等价于
git clean -fx
git clean -dfx # 删除当前目录下所有没有track过的文件和文件夹. 不管他是否是.gitignore文件里面指定的文件夹和文件
等价于
git clean -d -f -x