git 帮助
命令 | 意义 |
---|---|
git command -h | 查看当前command的帮助信息 |
cat etc/gitconfig | 查看git缩写的信息 |
git config --global | 查看git的缩写的信息 |
git config -l | 查看配置信息 |
git log | 查看历史记录 |
git的三种状态
已提交(committed),已修改(modified)和已暂存(staged)
命令 | 用法 |
---|---|
git add | 这个命令可以讲文件添加到git中也可以将在git工作区中的文件提交到暂存区中 |
git commit | 这个命令可以将暂存区的文件提交到git的本地数据目录中 |
git init
将当前所在文件夹创建为git所用的工作目录
git add
git add可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态
git status
用来查看暂存(git add 这个命令)前后两个版本之间的差异.
git diff
git diff 此命令比较的是工作目录中当前文件和暂存区域(git add 前后)快照之间的差异,也就是修改之后还没有
暂存起来的变化内容。
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用git diff --cached
命令。(Git 1.6.1 及更高版本还允许使用git diff --staged,效果是相同的,但更好记
些。
如果使用了git add将文件提到了暂存区那么在此使用git diff 将会什么都没有,也就是说这个命令得到的是当前文件和暂存区的差异,单单git diff 显示还没有有暂存起来的改动,而不是这次工作和上次提交之间的差异,而要看暂存前后的两个版本的差异应该使用git status 查看
git show
查看变化
git log
用法 | 意义 |
---|---|
git log | 会按照提交时间列出所有的更新,最近更新排在最上面,如果我们使用 |
-p | 选项可以展开每次提交内容的差异, 使用 |
-2 | 表示仅显示最近两次更新: |
--stat | 仅显示简要的增改行数统计 |
--pretty | 选项,可以指定使用完全不同于默认格式的方式展示提交历史,显示提交的remark信息 |
git log --pretty=oneline | 将每个提交放在一行显示 |
git log --pretty=short,full,fuller | 等不同的选项来展示信息的多少. |
-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(后跟指定格式)。 |
--author | 选项显示指定作者的提交 |
--grep | 选项搜索提交说明中的关键字 |
--all-match | 如果要得到同时满足这两个选项搜索条件的提交 |
-(n) | 仅显示最近的n 条提交 |
--since, --after | 仅显示指定时间之后的提交。 |
--until, --before | 仅显示指定时间之前的提交。 |
--author | 仅显示指定作者相关的提交。 |
--committer | 仅显示指定提交者相关的提交。 |
git rm & rm
移除文件是指从暂存区中移除文件,首先使用rm 从系统文件中删除这个文件,然后使用git rm 从暂存区中删除这个文件,这样再次查看git status的时候就能查看到没有这个文件了
如果只是单纯的不想追踪这个文件那么可以使用 git rm --cached filename来进行操作这样就不会将文件从系统中删除而保存下来
git mv
git mv old_file new_file # 其实这相当于执行了三个操作
$ mv README.txt README
$ git rm README.txt
$ git add README
git commit --amend
1.如果提交的评论出错可以直接使用 git commit --amend
2.如果是需要修改的内容有问题
可以先修改了内容然后 git add 然后再次执行git commit --amend 来进行将两次的操作进行合并这样就能修改已经提交的内容了
git reset
这个命令既可以执行回退文件也可以执行版本回退
1.文件从暂存区回到工作区
如果当前文件已经被git add .添加到暂存区,但是现在想从暂存区恢复到工作区中那么使用
git reset HEAD filename 或者使用git reset filename
就可以将文件恢复到没有add的状态
2. 版本回退
git reset HEAD^ # 一个^ 表示回退一个版本,也可以使用 HEAD~N这样的形式
(1) soft 参数:git reset --soft HEAD~1 意为将版本库软回退1个版本,所谓软回退表示将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区
(2) 默认的mixed参数:git reset HEAD~1 意为将版本库回退1个版本,将本地版本库的头指针全部重置到指定版本,且会重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段
(3) hard参数:git reset --hard HEAD~1 意为将版本库回退1个版本,但是不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码也回退到这个版本
git checkout -- filename
这个命令有点危险!
他会将工作区工作区中的文件恢复到上一个工作区的状态也就是重置这个文件,这个操作慎用
git remote
这个命令用来查看当前配置有哪些远程仓库
-v 选项可以显示对应的克隆地址
git fetch [remote-name]
这个命令是从远程仓库住区数据到本地.这个命令会拉去所有你本地的仓库中还没有的数据,如果克隆了一个仓库,此命令会自动将远程仓库归于origin名下,所以使用 git fetch origin 会住区你克隆的仓库的所有更新
值得注意的是:
git fetch
只会拉去数据到本地并不会自动合并到当前的工作分支,只有当你确实准备好了,才能手工合并/
默认情况下:
git clone
会自动创建了本地的master分支用于跟踪远程的master分支,所以可以直接使用git pull 来进行从远程仓库的抓取数据,并且合并到当前工作的分支当中.
git fetch -p origin
用于协作时,项目队友添加或删除了远程分支的分支,可以通过这种方式来刷新分支列表信息
git push
git push [remote-name] [branch-name]
把本地的分支推送到远端的分支上面,如果要把本地的master分支推送到origin服务器上可以使用下面的命令
git push origin master
注意:
这个命令只有当同一时刻没有其他人在推送数据,这个命令才会如期完成任务,如果有人在推送,那么应该先使用
git fetch 从远端抓取数据后,然后才可以再次推送
对于本地需要推送到远端的分支使用
git push 远端名字 本地分支的名字
运行git push origin serverfix:serferfix 来实现相同的效果,它的意思是“提取我的serverfix 并更新到远程仓库的serverfix”。
通过此语法,你可以把本地分支推送到某个命名不同的远程分支:若想把远程分支叫作awesomebranch,可以用git push origin serverfix:awesomebranch 来推送数据
push.default 有以下几个可选值:
nothing, current, upstream, simple, matching
其用途分别为:
- nothing - push操作无效,除非显式指定远程分支,例如git push origin develop(我觉得*。可以给那些不愿学git的 同事配上此项)。
- current - push当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支。
- upstream - push当前分支到它的upstream分支上(这一项其实用于经常从本地分支push/pull到同一远程仓库的情景,这种模式叫做central workflow)。
- simple - simple和upstream是相似的,只有一点不同,simple必须保证本地分支和它的远程
upstream分支同名,否则会拒绝push操作。 - matching - push所有本地和远程两端都存在的同名分支。
因此如果我们使用了git2.0之前的版本,push.default = matching,git push后则会推送当前分支代码到远程分支,而2.0之后,push.default = simple,如果没有指定当前分支的upstream分支,就会收到上文的fatal提示。
初次提交本地分支,例如git push origin develop操作,并不会定义当前本地分支的upstream分支,我们可以通过git push --set-upstream origin develop,关联本地develop分支的upstream分支,另一个更为简洁的方式是初次push时,加入-u参数,例如git push -u origin develop,这个操作在push的同时会指定当前分支的upstream。
git config 设置别名
git config --global alias.别名 命令的名字
比如:
git config --global alias.unstate 'reset HEAD --'
然后命令:
$ git unstage fileA
$ git reset HEAD fileA
是等同的!
设置格式化log输出:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置文件
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
git branch
命令 | 用法 |
---|---|
git branch -v | 显示操作记录 |
git branch --merge | 显示合并的分支 |
git branck --no-merged | 显示未合并的分支 |
git branch | 查看本地分支 |
git branch -r | 查看远端分支 |
git branch -a | 查看所有分支,包括本地和远程的 |
删除一个远端分支
- git branch -r -d
#-r表示操作的是远端 -d表示执行删除操作 - 通过推送一个空的分支到远端,用空分支覆盖掉远端分支,从而删除这个远端分支
git push origin :#注意,origin后面有一个 空格,以及一个冒号,这是必不可少的 - 删除已被删除的远程分支所对应的本地分支: 一个远程分支被删除了,可是本地还存在其对应的分支引用,可以这样删除:
git fetch -p
拉取远端分支
git checkout -t
# -t 意为 track,即跟踪一个远程分支 在初次clone时直接clone某一分支(默认是clone下来主分支master):git clone
-b
- 1,从已有的分支创建新的分支(如从master分支),创建一个dev分支
git checkout -b dev - 创建完可以查看一下,分支已经切换到dev
git branch dev master - 建立本地到上游(远端)仓的链接 --这样代码才能提交上去
git branch --set-upstream-to=origin/dev - 取消对master的跟踪
git branch --unset-upstream master
分支追踪
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
要为本地分支设定不同于远程分支的名字,只需在前个版本的命令里换个名字
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"
远程分支删除
如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的master 分
支(或任何其他存放稳定代码的地方),可以用这个非常无厘头的语法来删除它:git push
[远程名] :[分支名]
git add
命令 | 作用 |
---|---|
git add -A | 提交所有变化 |
git add -u | 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) |
git add . | 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件 |
git add可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态
版本回退
多次对一个文件使用git commit以后会出现多个版本,这样相当于是存盘,git 使用 HEAD 来指向现在的版本, 上一个版本就是 HEAD^ ,上上一个版本就是HEAD^^,上100个版本就是 HEAD~100.
命令 | 作用 |
---|---|
$ git reset --hard HEAD^ | --hard 的意思是:清空更改 --soft 退回更改到工作区 |
$ git reflog | 这个命令会记录你的每一次的操作命令一个命令的版本,这样再次使用git reset (版本号) 就可以恢复到想要的版本了 |
$ git lg | 这个命令可查看历史记录的信息用树图的形式展示 |
$ git log | 上面这两个命令都可以查看版本的信息 |
$ git diff HEAD -- file_name | 这个命令是查看工作区和版本库里的区别 |
撤销修改
命令 | 作用 | |
---|---|---|
$ git status | 查看当前的状态 | |
$ git checkout --filename | 可以丢弃工作区的修改,这里有两种情况,第一种没有放到暂存区,那么撤消 | 了以后和版本库一模一样,第二种如果添加到了暂存区,撤消后和暂存区的状态一模一样 |
$ git reset HEAD filename | 吧暂存区的修改撤销掉,重新放回工作区 这里的HEAD表示最新的版本 | |
$ git checkout -- filename | 可以把暂存区里的内容给删除掉 |
删除文件
删除文件的操作,当你的工作区中的文件被删除了然后版本库中的文件盒工作区中的文件不同了,他们不一致了,那么我们有两个选择,
- $ rm filename
- $ git rm filename
最后
$ git commit # 这样就从版本库中也删除了这个文件
分支合并
命令 | 作用 | |
---|---|---|
$ git checkout -b branch_name | 这是创建了一个新的分支并切换到这个分支 | |
$ git branch | 查看当前所有的分支,星号所在的位置就是当前指针所在的位置 | |
$ git merge branch_name | 这个命令是吧后面指定的branch_name的名字合并到当前所在的分支上,这里是 | 使用ff的模式进行合并,所以速度很快,但是不是所有的时候都要使用这个命令来合并 |
$ git branch -d branch_name | 这个命令是删除指定的分支 |
版本冲突
解决版本冲突问题
当两个分支同时对一个文件进行了修改就会有版本冲突问题,那么我们使用git status来查看是哪些位置冲突了
$ git status # 查看当前的状态
git 使用<<<<< ====== >>>>>> 来指示版本的冲突问题,这里可以修改不同的内容,然后重新add and commit
当你的版本和远端不一样的时候可以先使用pull来同步远端然后在本地合并合并后再次推送到远端就可以了
如果git pull 失败了是应为没有指定本地的dev 与远端的分支的连接,设置连接
$ git branch --set-upstrem dev origin/dev 这样就能形成了连接了,然后再次运行pull
分支策略
如果直接使用 git merge dev 那么默认采用的是快速合并模式也就是说ff模式,这种模式在删除分之后,分支的信息就会丢失. 如果强制金庸fastforward模式:
$ git merge --no-ff dev #这样就创建了一个新的commit
暂停工作
临时暂停现在手上的活,然后完成另外一个后重新工作
命令 | 作用 |
---|---|
$ git stash | 这个命令将当前的工作区储藏起来等以后现场了继续工作 |
$ git checkout -b debug001 | 然后创建新的分支 后面可以加上需要copy的文件名称. |
然后在这个名称上修复,修复完成后执行
git add . & git commit & git checkout master & git merge --no-ff debug001 & git branch -d debug001
这样就完成了临时的bug修复
命令 | 作用 |
---|---|
$ git stash list | 查看当前的保存的现场的工作信息 |
$ git stash pop | 将之前的工作区恢复并删除stash内容 |
当然你也可以多次保存或者保存多个信息,可以使用
git stash list 来查看信息然后恢复指定的stash 命令如下:
$ git stash apply stash@{0}
删除分支
$ git branch -d
$ git branch -D
推送分支
$ git push origin master
第一个是 远端的分支的名称,第二个是你要推送的本地的分支的名称 通常推送dev分支和incubator分支
日志输出
$ man git log [选项]
选项 | 意义 |
---|---|
--author=“Alex Kras” | 只显示某个用户的提交任务 |
--name-only | 只显示变更文件的名称 |
--oneline | 将提交信息压缩到一行显示 |
--graph | 显示所有提交的依赖树 |
--reverse | 按照逆序显示提交记录(最先提交的在最前面) |
--after | 显示某个日期之后发生的提交 |
--before | 显示发生某个日期之前的提交 |
查看尚未合并的变更
git log --no-merges master..
注意--no-merges 标志意味着只显示没有合并到任何分支的变更,master..选项,意思是指显示没有合并到master分支的变更(在master后面必须有..)。
你也可以运行 git show --no-merges master.. 或者 git log -p --no-merges master.. 命令(输出结果相同)来查看一下尚未合并的文件变更
修复而非新建提交
git commit --amend
如果提交尚未推送到远程分支,那么按照下面步骤简单操作一下就可以了:
1. 修复你的拼写错误
2. 将修正过的文件暂存,通过git add some-fixed-file.js
运行 git commit –amend 命令,将会把最近一次的变更追加到你最新的提交。同时也会给你一个编辑提交信息的机会。
rebase
命令 | 意义 |
---|---|
rebase -- abort | 会丢弃当前rebase 的项目回归到新建分支的操作中然后执行 |
git branch -D requeset/209xxx | 来删除当前分支然后在进行重新 check_rabase_integrate u/ |
git rebase --abort | 放弃rebase |
复制特定分支的内容
git checkout [branch] -- [file name]