安装
-
windows
下载安装 -
Ubuntu
apt install git
使用
- windows 右键打开git bash。
- Ubuntu 打开terminal
查看帮助命令,会在默认浏览器中打开对应命令的本地帮助手册:
git help command
# or
git command --help
Create
新建一个本地仓库:git init
会把当前文件作为git的仓库
克隆一个远程仓库:git clone repourl
把当前文件夹作为git的仓库克隆远程的仓库到本地
两者都会自动创建一个名为master
的本地分支。
Update
在git中,所有文件都分为三种状态
-
已修改
文件被修改了,还没提交到暂存区。修改状态包括,modified,new file,delete -
已暂存
文件被提交到暂存区,即被放到了下次将提交的清单中,下次做提交时将会提交这些文件。 -
已提交
已修改的文件被安全提交到了本地仓库中了。
添加修改到暂存区
# 添加单个文件
git add filename
# 添加全部文件,"."代表当前文件夹,将当前文件夹加入即代表添加全部文件
git add .
提交暂存区文件到本地仓库
# 交互式,会弹出提交信息编辑界面
git commit
# 直接添加信息
git commit -m "commit msg"
# 当目前没有新增文件时(即所有文件之曾被add过),可以add文件,直接使用下面的命令
git commit -a -m (可合并写为-am) "commit msg"
修改提交
- 修改最后一次提交
git reset --hard HEAD^
# 此命令的作用是将HEAD移动到当前HEAD所指向记录的前一条记录,主要参数有三个
# --mixed(默认),会将当前HEAD和HEAD^的差异放到工作区中,如果当前工作区中有内容,会将其混合在一起
# --hard 抛弃当前HEAD和HEAD^的差异,起到重置效果
# --soft 将当前HEAD和HEAD^的差异放到暂存区中
- 修改任意一次提交(删除提交,改变提交顺序,分拆提交,压缩提交)
git rebase -i commitref
# 以交互模式对指定修改变基,比如git rebase -i HEAD~3,修改前面三次的提交,反馈如下
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
# Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
# pick表示采用该次提交
# edit表示会编辑该次提交,当逐一应用每次提交到该次时,会把该次提交恢复到工作区,再自由提交(可拆分提交)
# squash表示压缩该次提交,和上一个pick的提交压缩为一次提交,可连续squash连续压缩为一次
# 该顺序代表了应用提交的顺序,可以修改顺序。删除改行,表示弃用该次提交
edit 310154e updated README formatting and added blame
squash f7f3f6d changed my name a bit
# 这样的修改表示,将第二次与第一次提交交换顺序
# 并编辑第二次修改
# 将第一次的提交和编辑后的第二次提交压缩为一次提交
# 删除第三次提交
- 拣选提交,从其他分支上拣选需要的提交到本地分支来,并不直接rebase
# 拣选提交
git cherry-pick commitref
- 抵消提交,在commit中提交一次和该应该用相反的修改,抵消该次修改的效果。
git revert commitref
撤销操作
- 撤销工作区修改
## 不加"--"可能会有歧义,如果有文件同名分支,则会迁出到该分支
git checkout -- filename
- 撤销暂存区修改
git reset HEAD filename
examine
- 查看当前状态
git status
- 查看分支
git branch
- 查看区别
# 工作区和暂存区不同
git diff
# 查看暂存区和上次提交不同
git diff --staged
# 查看工作区和上次提交不同
git diff HEAD
- 查看提交
# 查看某个commit
git show commitred
# 查看某个commit具体文件
git show commitref filename
- 查看提交历史
# 详细改动
git log -p
# 大致改动
git log --stat commitref
# 图形显示
git log --graph
# 查看单词级别的改动,U1指改动的上下文为一行,默认3,必须搭配U使用才能显示,新增单词用{++}括起来,删除单词用[--]
git log -U1 --word-diff
# 显示格式控制(长短) --pretty等价于命令--format
git log --pretty=oneline|short|medium|full|fuller|raw
# 显示格式控制(内容) %Cred-从此将输出颜色改为红色,%h-6位hash,%Cgreen-改为绿色,%Creset重置颜色,%n-换行
git log --pretty="%Cred%h %Cgreen%an %n %Creset%cD %n %C(#ff9900)%s %n"
# 将40位的SHA1值显示为6位
git log --abbrev-commit
# 等价于 --pretty=oneline --abbrev-commit
git log --oneline
# 查看前n个记录
git log -n
# 查看截止到commitref的提交历史
git log commitref
# 显示截至日期以后的记录 --since等价于--after
git log --after=24.hours
# 显示截至日期以前的记录 --until等价于--before
git log --before=3.days
# 限制最小父节点数量, =2时等价于命令--merge
git log --min-parents=2
# 限制最大父节点数量, =1时等价于命令--no-merge
git log --max-parents=1
branch and tag
- 分支 branch
# 查看分支 *指代当前分支
git branch
# 查看分支简要信息
git branch -v
# 查看已经被合并到当前分支的分支(即在本分支的上游)
git branch --merged
# 查看未被合并到当前分支的分支(即查看未合并的工作分支)
git branch --no-merged
# 新建分支
git branch branchname
# 切换分支
git checkout branchname
# 新建并切换到该分支
git checkout -b branchname
# 合并分支,将branchname分支合并到当前分支
git merge branchname
# 删除分支,-D强制删除,抛弃分支上未合并的修改
git branch -d branchname
# 将HEAD指向当前commit,和当前branch分离
git branch --detach
- 标签 Tag
# 显示标签,注:标签按字母顺序排序
git tag
# 轻量级标签
git tag tagName
# 打一个含注释标签,不着不用-m命令,交互式打标签
git tag -a tagName -m "tag msg"
# 显示标签信息
git show tagName
# 后期加注标签
git tag tagName commitref
# 删除标签
git tag -d tagName
# 推送标签到远程仓库,注:push不会推送tag,tag需要手动推送
git push remoteRepoName tagName
# 推送全部标签
git push remoteRepoName --tags
remote repo
# 查看远程仓库名
git remote
# 查看远程仓库简要信息
git remote -v
# 显示某个远程仓库信息
git remote show remoteRepoName
# 添加远程仓库
git remote add remoteRepoName remoteRepoUrl
# 重命名远程仓库
git remote rename oldName newName
# 删除远程仓库
git remote rmremoteRepoName
# 获取远程仓库数据,将远程数据镜像到本地,默认名字是origin,分支名为origin/branchName
git fetch
# 跟踪某个远程分支
git branch --set-upstream remoteRepoName/branchName
# 从远程分支迁出,自动跟踪这个分支
git checkout -b branchName remoteRepoName/branchName
# 拉取远程分支,fetch远程分支,并将tracked remote分支merge本地当前分支,后面加分支名表示拉取指定分支并merge到当前分支
git pull
# 重置跟踪远程分支
git branch --unset-upstream
# 推送到远程同名分支
git push(已track同名远程分支)
git push remoteRepoName branchName
# 推送到远程分支并关联,-u等价于--set-upstream,如果branchName=remoteBranchName,下次可直接git push
git push -u remoteRepoName branchName:remoteBranchName
Stash
储藏工作。当遇到需要紧急切换分支等情况,而当前的工作不足以做一次提交时,可以使用stash储藏当前工作,切换到另外的分支,完成工作再回到当前分支,取出储藏的工作,继续工作。也可以将当前工作区的工作储藏起来,到另外的分支取去来使用。
# 储藏工作
git stash
# 查看储藏的工作列表
git stash list
# 应用最近一次储藏
git stash apply
# 应用最后一次储藏,并从列表中删除
git stash pop
# 应用指定储藏
git stash apply stashref
# 以上的应用类似于 reset --mixed效果,将之前的暂存区和工作区更改混合后放到工作区,--index可原样恢复
git stash apply --mixed
# 删除指定的储藏
git stash drop stashref
# 取消应用的stash,没有unstash命令,但是可以曲线救国,以补丁的方式显示stash的内容,并把内容输出到apply命令以-R(reverse)方式应用。
git stash show -p | git apply -R
filter-branch
filter-branch
该命令通过对提交树应用自定义的分支达到对提交记录的修改。
# 从所有提交中删除一个文件
git filter-branch --tree-filter 'rm -f fileName' HEAD
# 对符合条件的修改提交做修改,--all选项用于指定所有分支,需要和前面的命令用```--```分隔开来
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" = "dhy" ];
then
GIT_AUTHOR_NAME="chdhy";
GIT_AUTHOR_EMAIL="chdhy@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' -- --all
# 删除修改过后系统留下的/original/refs/heads/branchname,即原提交的记录
# 删除指定分支记录
git update-ref -d refs/original/refs/heads/branchname
# 删除所有分支记录
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
Syntax
-
^
与某个提交记录合用,跟在其后面,可以是HEAD,hash值,HEAD^^^表示当前提交记录的往前的第三次记录 -
~
与^作用类似,用法为跟在其后面加数字,HEAD~8表示当前提交记录往前的第8次记录 -
..
指明范围语法,git log master..dev
表示从master分支出发,不包含master分支的提交记录。可以用来查看自上次推送远程仓库后再本地做的提交记录git log origin/dev..dev
,origin/master..
..不跟记录默认使用HEAD代替不存在的一边。 -
--not 或 前置^
表示不包含
# 三个命令等价
git log refA..refB
git log ^refA refB
git log refB --not refA
-
...
指代两者各自独有的部分,可以显示两个分支分叉的部分,配合特定命令调节符显示效果很清晰,<表示记录归属...左边的记录,>表示右边。
$ git log --left-right --oneline test2...test
< 57cb468 一个买不起
> 374db5a add code.txt
> 2546519 买不起,add code
> 5d5d530 let it go 买买买
.gitignore
.gitignore文件放在工作目录的顶层,让git忽略里面规定的文件类型,不做提交。参考如下:
# 忽略所有.txt文件
*.txt
# 除了note.txt
!note.txt
# 忽略'!a.do'这个文件
\!a.do
# 忽略build文件夹及其下的文件,但不包括根目录下的名字为'build'的文件
build/
# 忽略gen文件和gen文件夹,同/gen
gen
# 忽略bin目录下的直接子.class文件,如果其下还有文件夹,其子文件夹下的.class文件不会被忽略
gen/*.class
# 忽略log文件夹下的所有.log文件,包括其子文件夹下的文件,**包含文件夹下的所有文件夹
gen/**/*.log
# git默认不会添加空文件夹,可在空文件夹中加入文件.gitkeep强制添加空文件夹
# 其他基本过滤规则
* ?:代表任意的一个字符
* *:代表任意数目的字符
* {!ab}:必须不是此类型
* {ab,bb,cx}:代表ab,bb,cx中任一类型即可
* [abc]:代表a,b,c中任一字符即可
* [ ^abc]:代表必须不是a,b,c中任一字符
git config
git配置,一共有三种。
- 1.
.git/config
文件,用于针对项目范围内的配置 - 2.
~/.gitignore
文件,用于针对用户全局配置 - 3.
/etc/gitconfig
文件,Linux下针对所有用户的配置
# 查看用户配置,--global只看用户级的,默认看全部
git config --list
# 配置全局用户名
git config --global user.name "chdhy"
# 配置项目用户邮箱
git config user.email chdhy@qq.com
# 配置用户默认编辑器
git config --global core.editor vim
# 配置用户diff工具
* git config --global merge.tool vimdiff
# 配置全局命令别名
git config --all alias.com commit
git config --all alias.che chekout
git config --all alias.bra branch
git config --all alias.sta status
git config --all alias.rem remote
git config --all alias.fet fetch
git config --all alias.mer merge
git config --all alias.reb rebase
git config --all alias.res reset
git config --all alias.rev revert
# 利用别名创造新命令
git config --all alias.logo 'log --oneline'
git config --all alias.coma 'commit -am'
其他命令
# 查看git的HEAD的引用变化记录
git reflog
# 制作简报,显示从v1.0.1以来的提交记录,按author分类
git shortlog --no-merges master --not v1.0.1
参考:
- https://www.jianshu.com/p/fe76f2890a14
- https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- http://www.ruanyifeng.com/blog/2012/07/git.html
- https://github.com/github/gitignore/blob/master/Android.gitignore
- http://www.infoq.com/cn/news/2011/01/git-adventures-1?utm_source=news_about_git-adventures&utm_medium=link&utm_campaign=git-adventures
- https://blog.haohtml.com/archives/15965
网友评论