通俗的讲Git系统分三个区:本地工作区,暂存区/缓存区,本地仓库/远程仓库区。远程仓库只认从缓存区过来的代码(git commit),git add 的作用就是选择哪些本地工作区的文件/快照将其添加到缓存区
git status 可以查看哪些文件在本次修改了,以便我们清楚在下一步应该提交哪些文件
使用 git add 命令将想要快照的内容写入缓存区
git add 命令会监控工作区的状态树,使用这个命令会把工作区所有的变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但是不包括被删除的文件
使用 git commit命令则将缓存区内容添加到仓库中。


[git本地分支和远程分支改名]
#1 将本地分支进行改名
git branch -m old_branch new_branch
#2 将远程分支的老分支删除
git push origin :old_branch
#3 将改名后的分支push到远程
git push origin new_branch
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 branch && Git checkout常见用法
git branch 和 git checkout经常在一起使用,所以在此将它们合在一起
1.Git branch
一般用于分支的操作,比如创建分支,查看分支等等,
1.1 git branch
不带参数:列出本地已经存在的分支,并且在当前分支的前面用"*"标记
** 1.2 git branch -r **
查看远程版本库分支列表
1.3 git branch -a
查看所有分支列表,包括本地和远程
1.4 git branch dev
创建名为dev的分支,创建分支时需要是最新的环境,创建分支但依然停留在当前分支
1.5 git branch -d dev
删除dev分支,如果在分支中有一些未merge的提交,那么会删除分支失败,此时可以使用 git branch -D dev:强制删除dev分支,
** 1.6 git branch -vv **
可以查看本地分支对应的远程分支
1.7 git branch -m oldName newName
给分支重命名
2. Git checkout
1. 操作文件 2. 操作分支
2.1 操作文件
2.1.1 git checkout filename 放弃单个文件的修改
2.1.2 git checkout . 放弃当前目录下的修改
2.2 操作分支
2.2.1 git checkout master 将分支切换到master
2.2.2 git checkout -b master 如果分支存在则只切换分支,若不存在则创建并切换到master分支,repo start是对git checkout -b这个命令的封装,将所有仓库的分支都切换到master,master是分支名,
2.3 查看帮助
git checkout --help
当然git checkout还有许多命令,但这些已经能满足我们日常开发所需
学习无他法,唯有持之以恒
Git branch 操作
创建分支
git branch test: 基于当前commit创建test分支。.git/HEAD 文件中记录了当前分支名字。
删除分支
git branch -d test:删除本地test分支
git branch -D test: test分支还没有合入当前分支,所以要用-D参数才能删掉。
git push origin --delete test 删除远程test分支
git push origin :test 删除远程test分支
查看分支
git branch 列出当前分支清单
git branch -a 查看远程分支和本地分支
git branch -v 查看各个分支最后一个提交信息
git branch --merged 查看哪些分支已经合并入当前分支
拉取分支
git fetch origin 同步远程服务器的数据到本地
git checkout -b test origin/test_remote 将远程分支test_remote拉取下来到本地test分支
git checkout test 将远程分支test拉取下来到本地test分支
git pull test从远程分支test 中checkout下来的本地分支test成为跟踪分支,使用git pull或者git push就会操作到对应的远程分支test
切换分支
分支即是commit的不同引用,在这些分支上,会产生各自的历史。
分支切换即为HEAD引用的一个移动,以及暂存区与工作区的还原。切换分支的时候,会使用分支上最新的提交来还原暂存区和工作区.git checkout test: 切换到test分支,并指向
git checkout test_tag: 切换到test_tag,这时候处于detached HEAD状态。这时可以git checkout -b test_tag来创建test_tag分支,指向test_tag的commit。
合并分支
fast-forward merge:
git checkout master 切换分支到master
git merge test 将test分支合并到master分支,这时master分支指向的提交就是test分支最新的提交,并不会产生新的提交。
non-fast-forward merge
git checkout master 切换分支到master
git merge test 将test分支合并到master分支,如果有冲突,需要解决冲突后,将改动添加到暂存区,然后git merge --abort,之后再恢复暂存区,再提交后merge。这时就会增加一个提交,相比较于fast-forward merge。
git merge --abort:如果git merge的时候出现冲突,可以执行这个命令取消merge。
注意:如果有没提交的改动,建议不要使用git merge。否则git merge --abort的时候可能不会还原那些改动。
git cherry-pick commit_id 将一个分支的commit_id提交合并到当前分支上,并舍弃另一个分支上的其他提交。
Git merge如何判定冲突,机制如下:
先寻找两个commit的公共祖先,比较同一个文件分别在ours和theirs下对于公共祖先的差异,然后合并这两组差异。如果双方同时修改了一处地方且修改内容不同,就判定为合并冲突,依次输出双方修改的内容。
分支rebase
原理:回到两个分支最近的共同祖先,根据当前分支(也就是要变基的分支)后续历次提交生成一系列补丁文件,然后以基底分支最后一个提交作为新的出发点,应用上这一系列补丁文件,最后生成一个新的合并提交对象。从而修改当前分支的历史,成为基底分支的直接下游; 再使用Fast-forward合并一次即可。(首先用git rebase;再用git merge)
git rebase master test;git checkout master;git merge test 把test分支变基到master分支上
git checkout test; git rebase master;git checkout master;git merge test 把test分支变基到master分支上
git rebase --onto master server client git checkout master;git merge test 取出client分支,找出cient和server分支的共同祖先之后的变化,在master上重演一遍。
规则:不要对远程分支做rebase!
取消提交
取消git add file的内容:git reset HEAD file
取消修改的内容: git checkout -- file
回退到某个commit:
git reset --hard commit_id 彻底回退到commit_id版本,本地源码也恢复到commit_id版本
git reset --soft commit_id 回退到commit_id版本,修改的文件可以直接再提交
git reset commit_id 默认使用--mixed选项,回退到commit_id版本,修改的文件需要git add后才能提交
git checkout commit_id file_name 取消file_name的commit_id版本提交
HEAD 最近一个提交
HEAD^1 上一次提交
commit_id 每次提交的SHA1值,可以通过git log看到。
git push origin master -f 将当前commit_id的改动强制提交到master分支上。
修改提交
先取消提交,再修改文件重新提交。
git commit --amend 修改最后一次提交。先git add 新的changes,然后再跑这个命令重新提交。
暂存修改:
git stash save -a "stash1": 使用-a参数来保存当前修改为stash1,这时再用git status就看不到之前做的修改了。
还原暂存区的修改:
git stash list:查看所有stash列表
git stash pop --index stash@{0}: 还原stash@{0}的引用,如果加上stash引用,默认还原栈顶的引用。stash@{0}会从stash list中清掉。
git stash apply --index stash@{0}:既还原又保存stash@{0}。
git stash clear 清理所有stash
命令 | 作用域 | 常用情景 |
---|---|---|
git reset | 提交层面 | 在私有分支上舍弃一些没有提交的更改,撤销提交会重写提交历史, 不能用于公共分支。 |
git reset | 文件层面 | 将文件从缓存区中移除 |
git checkout | 提交层面 | 切换分支或查看旧版本 |
git checkout | 文件层面 | 舍弃工作目录中的更改 |
git revert | 提交层面 | 在公共分支上回滚更改, 在撤销一个提交的同时创建一个新的提交。安全,不会重写历史。 |
git revert | 文件层面 | (然而并没有) |
</article>
网友评论