git配置
git config --global user.name "zhangsan"
git config --global user.email zhangsan@xxx.com
概念解释
工作区 工作代码
暂存区 本地缓存
版本库 本地库
git log
git log [<options>] [<since>..<until>] [[--] <path>...]
主要参数选项如下:
-p:按补丁显示每个更新间的差异
--stat:显示每次更新的修改文件的统计信息
--shortstat:只显示--stat中最后的行数添加修改删除统计
--name-only:尽在已修改的提交信息后显示文件清单
--name-status:显示新增、修改和删除的文件清单
--abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符
--relative-date:使用较短的相对时间显示(例如:"two weeks ago")
--graph:显示ASCII图形表示的分支合并历史
--pretty:使用其他格式显示历史提交信息
git diff
1. git diff 工作区和暂存区比较
2. git diff HEAD 工作区和HEAD分支比较
3. git diff --cached 暂存区和HEAD
4. git diff B A 里程碑B和A对比
HEAD ^符号
HEAD代表版本库最近一次提交
符号^ 可以用于指代父提交,就是上一次提交
HEAD^ 代表版本库的上一次提交。最近一次提交的上一次提交
HEAD^^ 是HEAD^的上一次提交
git reset
1. git reset [-q] [<commit>] [--] <paths>...
第一种用法命令中包含路径<paths>,不会重置引用,不会改变工作区,而是用指定提交commit下的文件替换暂存区的文件。commit没有默认是HEAD
例如:git reset HEAD <paths>相当于取消之前执行的git add <paths>命令时改变的暂存区。
2. git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
<commit>都是可选项,可以使用引用或提交ID,如果省略默认就是使用了HEAD指向的提交ID
第二种用法,根据不同的选项,可以对暂存区和工作区重置。
1)使用--hard参数,如:git reset --hard <commit>
替换引用的指向,替换暂存区,替换工作区
2) 使用--soft参数,
替换引用指向
3)使用--mixed或不使用参数
替换引用的指向,替换暂存区
git checkout
1. git checkout [-q] [-<commit>] [--] <paths>...
第一种用法 commit是可选项,如果省略则相当于从暂存区替换工作区文件。如果有commit,相当于commit指向的文件替代工作区和暂存区
git checkout . 或者 git checkout -- <file> 会用暂存区的全部文件或指定文件替换工作区文件。这个操作会清除工作区未添加到暂存区的改动。
git checkout HEAD . 或者 git checkout HEAD <file> 会用HEAD指向的master分支中的全部或者部分文件替换暂存区和工作区的文件。这个操作会清除工作区未提交的改动,也会清除暂存区未提交的改动。
2. git checkout [<branch>]
第二种用法,git checkout 分支 切分支
3. git checkout [-m] [[-b | --orphan] <new_branch>] [<start_point>]
第三种方法,gitbranch –r查看分支gitcheckout xxx/xxx-android-4.4.4_r2_CMCC -b xxx-android-4.4.4_r2_CMCC
git stash
1. git stash
保存当前工作进度。会分别对暂存区和工作区的状态进行保存。也会对当前的暂存区和工作区重置
2. git stash list
显示进度列表 git stash 可以多次保存工作进度,并且在恢复的时候进行选择
3. git stash pop [--index] [<stash>]
如果不使用任何参数,会恢复最新保存的工作进度,并将恢复的工作进度从存储的列表中清除。
如果提供<stash>参数(来自git stash list显示的列表),则从该<statsh>中恢复。选项--index除了恢复工作的文件外,还尝试恢复暂存区。
4. git stash [save [--patch] [-k | --[no-]keep-index] [-q | --quiet] [<message>]
这是第一条的完成版。git stash save "message..." 保存工作进度时,加上说明
--patch显示工作区和HEAD的差异
-k或--keep-index参数,在保存进度后不会将暂存区重置。默认会重置暂存区和工作区
5. git stash apply [--index] [<stash>]
和git stash pop一样,就是不会删除进度列表中相对应的存储。
6. git stash drop [<stash>]
删除一个存储的进度,默认删除最新的进度
7. git stash clear
删除所有存储的进度
注意:切分支的时候很有用,比如你有修改要在某个分支上库,可以先使用git stash讲修改保存起来,然后切分支;切到新分支再git stash pop然后在新的分支上面上库。
开发完上库之前合入新代码
git stash save "message"
git pull(或者repo sync)
git stash apply
git status .(看冲突地方解冲突)
git rm
git rm --cached <file> 删除暂存区文件,工作区不受影响
git rm 提交删除文件到版本库
git blame
git blame 文件 查看整个文件每行的提交
git blame -L 开始行号, +结束行号 文件 具体查看文件哪几行的提交 开始行号,结束行号可以使用+号代表多少行
git commit
git commit提交
git commit --amend修改上一次提交
repo命令集
1. repo status 查看各个git仓的状态
2. repo diff 各个仓的差异
git pull & pit fetch
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决.
地址:https://www.cnblogs.com/runnerjack/p/9342362.html
分支的概念
在介绍两种方法之前,我们需要先了解一下分支的概念:
分支是用来标记特定代码的提交,每一个分支通过SHA1sum值来标识,所以对分支的操作是轻量级的,你改变的仅仅是SHA1sum值。
如下图所示,当前有2个分支,A,C,E属于master分支,而A,B,D,F属于dev分支。
A----C----E(master)
\
B---D---F(dev)
- 1
- 2
- 3
它们的head指针分别指向E和F,对上述做如下操作:
git checkout master //选择or切换到master分支
git merge dev //将dev分支合并到当前分支(master)中
- 1
- 2
合并完成后:
A---C---E---G(master)
\ /
B---D---F(dev)
- 1
- 2
- 3
现在ABCDEFG属于master,G是一次合并后的结果,是将E和F的代码合并后的结果,可能会出现冲突。而ABDF依然属于dev分支。可以继续在dev的分支上进行开发:
A---C---E---G---H(master)
\ /
B---D---F---I(dev)
- 1
- 2
- 3
- 4
分支(branch)的基本操作:
git branch //查看本地所有分支
git branch -r //查看远程所有分支
git branch -a //查看本地和远程的所有分支
git branch <branchname> //新建分支
git branch -d <branchname> //删除本地分支
git branch -d -r <branchname> //删除远程分支,删除后还需推送到服务器
git push origin:<branchname> //删除后推送至服务器
git branch -m <oldbranch> <newbranch> //重命名本地分支
/**
*重命名远程分支:
*1、删除远程待修改分支
*2、push本地新分支到远程服务器
*/
//git中一些选项解释:
-d
--delete:删除
-D
--delete --force的快捷键
-f
--force:强制
-m
--move:移动或重命名
-M
--move --force的快捷键
-r
--remote:远程
-a
--all:所有
git fetch 用法
git fetch 命令:
$ git fetch <远程主机名> //这个命令将某个远程主机的更新全部取回本地
- 1
如果只想取回特定分支的更新,可以指定分支名:
$ git fetch <远程主机名> <分支名> //注意之间有空格
- 1
最常见的命令如取回origin
主机的master
分支:
$ git fetch origin master
- 1
取回更新后,会返回一个FETCH_HEAD
,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:
$ git log -p FETCH_HEAD
git pull 用法
前面提到,git pull
的过程可以理解为:
git fetch origin master //从远程主机的master分支拉取最新内容
git merge FETCH_HEAD //将拉取下来的最新内容合并到当前所在的分支中
- 1
- 2
即将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:
$ git pull <远程主机名> <远程分支名>:<本地分支名>
- 1
如果远程分支是与当前分支合并,则冒号后面的部分可以省略:
$ git pull origin next
Git push
在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构。
git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,
第一个master是本地分支名,第二个master是远程分支名。
1.1 git push origin master
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
1.2 git push origin :refs/for/master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
1.3 git push origin
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
1.4 git push
如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
1.5 git push 的其他命令
这几个常见的用法已足以满足我们日常开发的使用了,还有几个扩展的用法,如下:
(1) git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push,
不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式
如果想更改设置,可以使用git config命令。git config --global push.default matching OR git config --global push.default simple;可以使用git config -l 查看配置
(2) git push --all origin 当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项
(3) git push --force origin git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。
(4) git push origin --tags //git push 的时候不会推送分支,如果一定要推送标签的话那么可以使用这个命令
1.6 关于 refs/for
// refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要
git cherry-pick
git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit)。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了。
就是对已经存在的commit 进行 再次提交;
使用方法如下:
git cherry-pick <commit id>
查看冲突的文件:
使用git status
both modified: app/models/user.rb