WIP=work in progress 使用说明原文
文件状态: untracked, unmodified(git commited), modified, staged/cached(git added)
HEAD: the head of the current branch. Last commit snapshot, next parent。“提交~”表示其父提交,后面可再加数字表示其前几提交;类似的,^表示其原始提交。
Index: Proposed next commit snapshot ↑commit ↓reset --soft HEAD~
working tree: Sandbox ↑stage ↓(from Index) reset ↓(from HEAD) reset HEAD~
clean working tree: ↑modify ↓(from HEAD) reset --hard HEAD~
^{reference}或--not {reference}表示非该引用
{reference}^{number} 表示指定引用后指定数目的提交,默认为1. “引用”如HEAD或分支名。^能连续多次,连续两次与~作用相同,^与~也能混合使用。
{reference}..{reference}表示两个引用之间的所有提交,引用默认为HEAD。
{reference}...{reference}表示两个引用之一且非两个同时的所有提交
简要显示状态:git status -s
不统计不在库中的文件,以加速状态显示:git status -uno
.gitignore:星号开始的行被忽略;目录名以斜线结束;以叹号开始的行不被git忽略。
将staged与上次的提交比较:git diff --staged
与已经staged状态比较:git diff --cached
git difftool 显示图形界面的git diff
# to use vim for diff
git config diff.tool vimdiff
# to edit all files in a row
git config --global difftool.prompt false
# git d to invoke git difftool
git config --global alias.d difftool
建立初始库:git init
取库:git clone 用户名@地址[:端口]/路径 [--mirror/reference=目录]
mirror参数表示成为远端的镜像,下次取时用reference指明之前的目录,与远端相同的代码就会从本地取。
git add -i 显示代码状态,并可选择更新、添加、比较、回退、做补丁。回答序号时如果需要多选 ,则用逗号分隔,直接回车后才确认:如选择更新,然后写要更新的文件序号(多个可用逗号分隔)回车,然后可再继续写,最后直接回车,才确认操作。选择差别后,先选择文件,才显示其差别。
add和reset 命令支持--patch参数,可选择操作的具体内容。
git commit -m "标题"
git commit -a=git add; git commit,但是不增加新文件
git commit --amend
git rm,如果不想实际删除本地的文件,则加--cached参数;可用通配符。
git mv
git cherry-pick 二进制文件有冲突时,如果丢弃本地修改,则先`git reset HEAD 文件名`,然后`git restore 文件名`。参考有人提出用git checkout --theirs
批量修改提交记录
保存
保存当前状态以便切换分支:git stash [save],如果也需要保存不在库(index)中的(untracked)文件,加-u参数。加--patch参数则会逐个文件询问是否保存。
显示保存的状态:git stash list
取回(重现)保存的状态:git stash apply 名字形如stash@{0},默认为最近的一个保存。然后,git stash --index,可继续将之前已经stage的文件(git added)恢复状态。
删除保存的状态:git stash drop
git stash pop=git stash apply; git stash drop
恢复
回退提交:git reset,后面写提交(回退到该提交),可加文件名,默认为HEAD,则与add相反,unstaging,修改Index;可加参数--soft或--hard,见本文开始处描述。
git revert,与commit相反,后面加提交号:是回退该提交,而非回退到该提交!失败后,加参数:--continue继续;--abort取消;--quit中止。
清空本地修改:git clean,参数-i表示需要提问确认
删除不在库中的文件:git clean -f -d,如果也要删除在.gitignore中的文件,再加-x参数。
git checkout 如果写提交号,而不写文件名,则会移动当前HEAD,并处于分离分支状态,可继续以“git checkout -b 分支名”建立分支。
从库中删除最近若干提交:git rebase -i HEAD~想删除的数量加一,然后推送到服务器git push origin +master
日志
git log -数字 指定显示修改的数目
git log -p 显示所有修改详情
git log --name-only 显示修改的文件名,如果还要显示各文件修改的行数,则改用--stat参数
限制显示的提交的时间:git log --since=时间,since可换为until或before或after。
git log --author,author亦可换为commiter。
git log --grep 搜索提交的标题。如果同时使用grep与author,则还需要--all-match参数,否则为满足两者条件的任一条件,而非其交集。
git log -S搜索提交的内容
git log --graph 显示关系树
git format-patch 根据提交生成补丁文件,其控制生成对象范围的参数与log命令的类似。生成出的文件用git apply {文件名}使用
分支与远端
- 新建本地分支:git checkout -b 分支名 = git branch 分支名; git checkout 分支名
新建对应指定远端分支的本地分支:git checkout -b 本地分支名 远端名/远端分支名 - 在本地分支间切换:git checkout 分支名
当该分支名在远端也存在时,则本地分支会对应该远端分支 - 切换本地分支对应的远端分支:git branch -u 远端名/远端分支名
- 合入所有修改:在需要合入的目标分支上,git merge 需要合入的源分支名
或,在临时分支上,git rebase 最终分支名,之后,最终分支上fast forward就能得到临时分支上的修改 - 删除本地分支:git branch -d 分支名
- 合入修改有冲突时:用git mergetool修改后commit
- 列本地分支:git branch,第一列为星号的是当前分支(HEAD),其它为空格
git branch -v还会显示各分支最后一个提交的标题
git branch -vv还会再显示各对应的远端分支名
参数--merged和--no-merged控制只显示已经(包括当前分支)或尚未(这些分支不允许直接用-d参数删除,需要用-D)合并到当前分支的分支 - origin是默认的远端(服务器)的名字
master是默认的分支名。所以本地分支默认是master,远端是origin/master - 添加远端名字:git remote add 名字 地址
- 显示远端名:git remote,加参数-v可显示地址;加参数show显示详情,后面可再加远端名,默认是origin;加三个参数rename、原名、新名,可更改远端名;加两个参数rm、名,可删除到远端的关联。
- 获取远端修改(不合入):git fetch,后面可加远端名(当非origin时)
--all参数可将获取所有远端的修改 - 合入远端修改:git pull=git fetch;git merge或rebase
- 提交到远端:git push 远端名 本地分支[:远端分支],如果两个名相同,则不用写可选部分
- 删除远端分支:git push 远端名 --delete 分支名
标签tag
轻量级lightweight标签指向指定提交:添加标签用git tag 标签名。
注释型annotated标签包含打标签人的信息等:添加标签用git tag -a 标签名,后面加加参数-m和标题字符串。
打标签时可加提交号作为参数对该提交打标签。
显示所有标签: git tag, 结果按字母排序。加参数-l后加字符串可对结果进行过滤。
git show 后面可加标签名
提交到远端:git push 远端名 标签名或--tags表示所有标签
获取内容:如git checkout -b 分支名 标签名
本地删除:git tag -d 标签名
远端删除:git push --delete origin 标签名
命令简化
git config --global alias.简化名 命令字符串