详细 git 教程 : progit
# 删除 untracked files
git clean -f
# 连 untracked 的目录也一起删掉
git clean -fd
# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd
git clean -nf
git clean -nfd
git查看各个branch之间的关系图:
$ gitk --simplify-by-decoration --all
说明:
--simplify-by-decoration 只显示被branch或tag引用的commit
--all 表示显示所有的branch,这里也可以选择,比如我指向显示分支ABC的关系,则将--all替换为branchA branchB branchC
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
$ git show v1.4
$ git push origin v1.5
$ git push origin --tags
$ git checkout -b version2 v2.0.0
$ git log --oneline --since=1.weeks
$ git log --oneline --since='2018-09-23'
$ git log -1 --pretty=fuller
submodules
$ git submodule add https://github.com/chaconinc/DbConnector // 添加 子模块
$ git clone --recursive https://github.com/chaconinc/MainProject // 自动初始化并更新仓库中的每一个子模块。
$ git submodule update --remote DbConnector // 更新 子模块 (默认更新并检出子模块仓库的 master 分支。)
$ git submodule update --remote --merge // 从上游拉取新工作,将它们合并到你的本地工作中
$ git submodule update --remote --rebase // 从上游拉取新工作,将它们变基到你的本地工作中
$ git push --recurse-submodules=check // 让 Git 在推送到主项目前检查所有子模块是否已推送
$ git push --recurse-submodules=on-demand // 进入每一个子模块中然后推送到远程仓库
mergetool
$ git mergetool --tool-help
$ git mergetool -t P4Merge
bundle
git bundle create <file> <git-rev-list-args>
git bundle verify <file>
git bundle list-heads <file> [<refname>…?]
git bundle unbundle <file> [<refname>…?]
bisect
blame
$ git blame -L 37,39 app/src/main/java/com/marykay/xiaofu/util/LanguageUtil.java
忽略空白
$ git merge -Xignore-all-space master // ignore-space-change ignore-all-space
如果 合并的 分支 只有 whitespace 不同,则 应用我们的代码
如果 合并的 分支 除了 whitespace 不同,还有 其他的不同,则应用 新分支的代码
filter-branch
如果想要通过脚本的方式改写大量提交的话可以使用它 - 例如,全局修改你的邮箱地址或从每一个提交中移除一个文件。 这个命令是 filter-branch,它可以改写历史中大量的提交,除非你的项目还没有公开并且其他人没有基于要改写的工作的提交做的工作,你不应当使用它。
grep
默认情况下 Git 会查找你工作目录的文件。 你可以传入 -n 参数来输出 Git 所找到的匹配行行号。
$ git grep -n gmtime_r
你可以使用 --count 选项来使 Git 输出概述的信息,仅仅包括哪些文件包含匹配以及每个文件包含了多少个匹配。
$ git grep --count gmtime_r
如果你想看匹配的行是属于哪一个方法或者函数,你可以传入 -p 选项:
$ git grep -p gmtime_r *.c
cherry-pick
另一种将引入的工作转移到其他分支的方法是拣选。 Git 中的拣选类似于对特定的某次提交的变基。 它会提取该提交的补丁,之后尝试将其重新应用到当前分支上。 这种方式在你只想引入特性分支中的某个提交,或者特性分支中只有一个提交,而你不想运行变基时很有用。
如果你希望将提交 e43a6 拉取到 master 分支,你可以运行:
$ git cherry-pick e43a6fd3e94888d76779ad79fb568ed180e5fcdf
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
3 files changed, 17 insertions(+), 3 deletions(-)
这样会拉取和 e43a6 相同的更改,但是因为应用的日期不同,你会得到一个新的提交 SHA-1 值。
diff
对于 diff 命令来说,你可以通过把 ... 置于另一个分支名后来对该分支的最新提交与两个分支的共同祖先进行比较:
$ git diff master...contrib
该命令仅会显示自当前特性分支与 master 分支的共同祖先起,该分支中的工作。 这个语法很有用,应该牢记。
rabase 变基
git rebase master topic // 将 topic 分支 上的 commit 转移到 master 分支 --反了?
git rebase --onto master next topic // 将 next 分支 和 topic 分支的 diff commit 转移到 master 分支
patch 补丁
git format-patch CommitId1..CommitId2
$ git format-patch 8ae8975..ab88f04 -o d:/patch/ 打patch到指定目录
$ git apply --check 0001-oauth-clientId-secret.patch 检查patch能否应用
$ git apply d:/patch/0001-fix-ph-issue-2.patch // 不带提交记录
$ git am d:/patch/0001-fix-ph-issue-2.patch // 带作者和提交记录
1.$ git am 0001-XXX.patch
(错误信息如下)
...
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".
2.$ git apply --reject 0001-XXX.patch
先合并没有产生冲突的文件,根据同目录下的*.rej文件找出冲突地方
3.$ git add ***
把本次patch改动的文件添加进入缓存
4.$ git am --continue
// >> 后加输出文件的路径、文件名和后缀名
git diff [branchA] [branchB] >>d:/gitDiff/diff.txt
$ git diff -p --binary cf3b47b 7a82d26 >> d:/patch/patch
$ git checkout -b dev origin/dev
$ git checkout --track origin/dev
删除远程分支:
$ git push origin -d name
设置已有的本地分支跟踪一个远程分支:
$ git branch -u origin/dev
Branch 'master' set up to track remote branch 'dev' from 'origin'.
查看设置的所有跟踪分支
$ git branch -vv
推送到远程仓库指定分支
git push -u origin/remote_branch
Git 别名
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
新建分支
$ git branch iss53
$ git checkout iss53
切换分支
$ git checkout -b iss53 master
git branch --merged 查看哪些分支已被并入当前分支
一般来说,列表中没有 * 的分支通常都可以用 git branch -d 来删掉。原因很简单,既然已经把它们所包含的工作整合到了其他分支,删掉也不会损失什么。
git branch --no-merged 显示还未合并进来的分支
切换分支
$ git checkout -b iss53 master
$ git branch iss53
$ git checkout iss53
标签tag
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
$ git show v1.4
你想要查看 experiment 分支中还有哪些提交尚未被合并入 master 分支。 你可以使用 master..experiment 来让 Git 显示这些提交。也就是 “在 experiment 分支中而不在 master 分支中的提交”。 为了使例子简单明了,我使用了示意图中提交对象的字母来代替真实日志的输出,所以会显示:
$ git log master..experiment
$ git log origin/master..HEAD
这个命令会输出在你当前分支中而不在远程 origin 中的提交。
如果我们想找到 DiskCacheStrategy.ALL 常量是什么时候引入的,我们可以使用 -S 选项来显示新增和删除该字符串的提交。
$ git log -S DiskCacheStrategy.ALL --oneline
log命令
Table 1. git log --pretty=format 常用的选项
选项
说明
%H
提交对象(commit)的完整哈希字串
%h
提交对象的简短哈希字串
%T
树对象(tree)的完整哈希字串
%t
树对象的简短哈希字串
%P
父对象(parent)的完整哈希字串
%p
父对象的简短哈希字串
%an
作者(author)的名字
%ae
作者的电子邮件地址
%ad
作者修订日期(可以用 --date= 选项定制格式)
%ar
作者修订日期,按多久以前的方式显示
%cn
提交者(committer)的名字
%ce
提交者的电子邮件地址
%cd
提交日期
%cr
提交日期,按多久以前的方式显示
%s
提交说明
Table 2. git log 的常用选项
选项
说明
-p
按补丁格式显示每个更新之间的差异。
--stat
显示每次更新的文件修改统计信息。
--shortstat
只显示 --stat 中最后的行数修改添加移除统计。
--name-only
仅在提交信息后显示已修改的文件清单。
--name-status
显示新增、修改、删除的文件清单。
--abbrev-commit
仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date
使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph
显示 ASCII 图形表示的分支合并历史。
--pretty
使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。
Table 3. 限制 git log 输出的选项
选项
说明
-(n)
仅显示最近的 n 条提交
--since, --after
仅显示指定时间之后的提交。
--until, --before
仅显示指定时间之前的提交。
--author
仅显示指定作者相关的提交。
--committer
仅显示指定提交者相关的提交。
--grep
仅显示含指定关键字的提交
-S
仅显示添加或移除了某个关键字的提交
取消暂存的文件
use "git reset HEAD <file>..." to unstage
虽然在调用时加上--hard 可以令 git reset 成为一个危险的命令(译注:可能导致工作目录中所有当前进度丢失!),但本例中工作目录内的文件并不会被修改。 不加选项地调用 git reset 并不危险 — 它只会修改暂存区域。
撤消对文件的修改
use "git checkout -- <file>..." to discard changes in working directory
你需要知道 git checkout -- [file] 是一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。 除非你确实清楚不想要那个文件了,否则不要使用这个命令。
撤消已经提交的
$ git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
A). –hard:重设index和working directory,从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>。
彻底回退到某个版本,本地的源码也会变为上一个版本的内容。
B). –soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。自从<commit>以来的所有改变都会显示在git status 的“Changes to be committed”中。
回退到某个版本,只回退了commit的信息。如果还要提交,直接commit即可。
C). –mixed:仅重设index,但是不重设working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效 果是,working directory中文件的修改都会被保留,不会丢弃,但是也不会被标记成“Changes to be committed”,但是会打出什么还未被更 新的报告。回退到某个版本,只保留源码,回退commit和index信息。
修改提交
$ git commit -amend
查看当前的远程库
要查看当前配置有哪些远程仓库,可以用 git remote 命令,可以加上 -v 选项
查看远程仓库信息
我们可以通过命令 git remote show [remote-name] 查看某个远程仓库的详细信息
从远程仓库抓取数据
正如之前所看到的,可以用下面的命令从远程仓库抓取数据到本地:
$ git fetch [remote-name]
储藏工作(保存进度)
$ git stash
查看 保存进度
$ git stash list
恢复 进度
$ git stash apply
$ git stash apply@{2}。
移除 保存的进度
$ git stash drop stash@{0}
恢复 保存的进度 并移除
$ git stash pop stash@{0}
运行 git stash pop 来应用储藏然后立即从栈上扔掉它