常见场景
暂存区
确认暂存区
1 | // 增加所有文件到暂存区 |
撤销暂存区
1 | // 取消所有最新的暂存区文件 |
注意该命令的参数HEAD是要被恢复的版本, 一般选择HEAD, 即恢复到最新的HEAD。
下面撤销commit也使用该命令。
提交
确认提交
1 | // 进行一次提交并附加消息'message' |
撤销提交
git revet
git revert
进行一个新提交(commit)来恢复其他提交所做的更改。
1 | $ git revert HEAD 撤销前一次 commit |
git reset [version]
该命令会将头部指到指定的版本位置。
例如:
1 | $ git reset HEAD^ # 回退所有内容到上一个版本 |
–hard会强制删除之前所有的信息提交. 慎用.
例如
1 | $ git reset –hard HEAD~3 # 回退上上上一个版本 |
但是仍然可以恢复.
git log -g 全局找到我们 commit 1 ID
git branch recover_bracch commit 1, 创建一个新的分支,
git merge recover_bracch 然后合并回来,
git restore
git restore
是用来将工作区的文件恢复到上一次暂存区的数据。
修改错误的提交
这种情况可能是提交的文件错误或者message写错了.
此时可以使用 git commit --amend
来修改.
1 | $ git commit --amend |
接下来会弹出文本编辑器来修改对应信息, 不同系统不同,可以设置.
其信息大致如下:
1 | new repaired message |
第一行就是message, 后面还包含新增或删除的文件
切换到制定提交位置
移动HEAD, 一般使用checkout
命令.
格式:
1 | $ git checkout <SHA-1> |
示例
1 | $ git checkout ea321 // 切换到ea321版本 |
提交合并
使用git rebase
命令可以合并commit.
格式
1 | $ git rebase -i [startpoint] [endpoint] |
[startpoint]
[endpoint]
则指定了一个编辑区间,如果不指定[endpoint]
,则该区间的终点默认是当前分支HEAD
所指向的commit
(注:该区间指定的是一个前开后闭的区间)。
比如:
1 | // 效果一致 |
然后会弹出编辑器.
1 | pick b4d576b add b.phppick 90bc004 add c.php |
然后根据命令修改.
接下来还需要reset一下,才能完rebase.
不同分支合并
还可以将不同的分支合并到到一起,比如将develop分支的前3个提交合并到master上.
使用以下命令:
1 | $ git rebase [startpoint] [endpoint] --onto [branchName] |
例如:
1 | $ git rebase ab123 ab124 --onto master |
远程仓库同步
设置远程仓库
可以通过git remote
或者通过git branch
命令来配置远程仓库。
格式
1 | $ git remote add [name] [url] |
例如
1 | // 新增远程仓库 |
确认推送
使用git push
命令可以使用本地引用更新远程引用,同时发送完成给定引用所必需的对象。
例如
1 | // 如果配置了远程仓库,则直接git push |
撤销推送
- 本地回退版本
先使用git reset
回退版本
1 | $ git reset --soft aa909cff2239536df14820fe086d96305b24e9f1 |
- 通过强制push,将旧版本推送到远程仓库
1 | $ git push origin master --force |
注意必须添加--force
,因为版本是落后的。
分支
新增分支
示例
1 | // 切换到newBranch分支,如果不存在则创建后再求切换 |
branch
,switch
命令本就是为了减轻checkout
命令而生,所以方法基本一致。
删除分支
同样的可以使用git branch
来删除分支。
1 | // 删除本地分支 |
恢复分支
格式
1 | git branch <branch_name> <hash_val> |
示例
1 | git branch dev1 123d |
Git会自行负责分支的管理,所以当我们删除一个分支时,Git只是删除了指向相关提交的指针,但该提交对象依然会留在版本库中。
因此,如果我们知道删除分支时的散列值,就可以将某个删除的分支恢复过来。在已知提交的散列值的情况下恢复某个分支。
可以通过查看本地文件的log文件或者reflog
命令来查找。
合并分支
git merge
通过git merge
命令,可以将分支合并到一起。
例如
1 | // 假设当前在matser,且落后dev1一个版本 |
注意这里还有fast-forward
和--no-ff
的区别,
fast-forward
即直接移动当前分支的头指针到对应的合并位置。条件是两个分支不存在冲突。--no-ff
是新建一个提交,然后将merger两个位置的下一次都指向这个新的提交。
如果条件满足时,merge 默认采用的
fast-forward
方式进行合并,除非你显示的加上--no-ff
选项;而条件不满足时,merge 也是无法使用fast-forward
合并成功的!
git rebase
正如前面介绍的, git rebase
实际上也可以做类似的工作。git rebase
可以将对应分支的基(即出发位置)合并到当前分支。(或者自己指定两个分支)。
例如:
1 | // 假设当前在matser,且落后dev两个版本 |
则dev的指针指向了master的分支上,如下图:
stash
暂存一个不需要立即操作的文件树版本,将版本恢复到上一个commit。
示例
1 | // 缓存一个版本 |
冲突处理
避免冲突
首先应当是避免冲突,每个人应该负责不同的模块,然后只修改对应的文件。过多的冲突应当是分工存在问题。
经常commit
减少冲突的另一个方面是经常push,将自己的代码提交到仓库,尽量避免一次提交过多的文件。其次应当保证commit的原子性,即一个commit只做一件事情。
写代码之前同步
在写代码之前,先pull一下,保证自己本地的代码已经同步了远程仓库,以减少可能发生的冲突。
手动处理
当前git已经很智能,只要存在冲突,就无法提交,或者merge。并且git会提示那些文件存在冲突,然后在文件中通过一定格式来标记,来让我们手动处理冲突。
例如:
1 | 士大夫第卅方4时5撒发射点发生 |
<<<
到|||
显示的是当前 master 分支上修改后的内容|||
到----
向您显示 master 分支与 dev 分支修改前共同的内容是什么---
到>>>
显示的是 dev 分支上修改后的内容,也就是要合并分支的内容=======
用于分割不同的冲突点。
此时我们只需要删除不需要的代码(包括git的提示信息),然后将修改添加到暂存区,并进行提交更改。
最后再次进行提交或合并即可。