基础命令
https://gitee.com/all-about-git 大全
- 克隆项目
git clone https://gitee.com/Armink/FlashDB.git
- 将改动从工作区移动到暂存区
git add . 或者 git add 文件名
- 将暂存区改动提交本地仓库
git commit -m "提交说明 例如 #223 [修改] 修改前端规范"
- 推送本地仓库至远程仓库
git push
- 拉取远程代码至本地
git pull
git 配置项
- 配置用户名
git config --global user.name "wangzixing"
- 配置邮箱
git config --global user.email "[email protected]"
- 列出全局配置
git config --global --list
git日志
- 查看当前分支所有日志
git log
- 查看commit_id 和提交信息
git log --pretty=oneline
-
查看某次提交的详细信息
git show be24e214620fa072efa877e1967571731c465884 -
查看某次提交中新版和旧版的对比信息
git diff 0134af0400597b85ac80b08ff0344f1a115ddc32
可以看到符号 “+“ (绿色),表示添加的内容。如果有 “-”(红色)则表示删除的内容。 -
查看最近的4条日志
git log -n 4
git版本操作
- 回退到上一个版本
git reset --hard HEAD^
- 回退到指定版本
git reset --hard commit-id
- 把已经add但是尚未commit的文件重新放回工作区
git reset HEAD index.php
- 丢弃工作区文件的修改,还原成版本库的样子
git checkout index.php
#丢弃全部
git checkout .
#如果误删除了一个文件恢复
git checkout index.php
- git reset 选项
https://www.jianshu.com/p/c2ec5f06cf1a 参考- --hard
整个项目回滚到某个commit 撤销其他所有更改,文件是会变的,类似于重新克隆至某个commit
- --hard
(1) 要放弃目前本地的所有改变时候,即去掉所有add到暂存区的文件和工作区的文件,
可以执行 git reset -hard HEAD 来强制恢复git管理的文件夹的內容及状态;
(2) 真的想抛弃目标节点后的所有commit(可能觉得目标节点到原节点之间的commit提交都是错了,之前所有的commit有问题
2. --soft
回归到某个commit但是文件不会变,只是这些文件变成了差异修改,状态类似于你写完代码 add 完的那一刻
原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files),所以假如我们之前工作目录没有改过任何文件,也没add到暂存区,那么使用reset --soft后,我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。为什么要这样呢?这样做的使用场景是:假如我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交,就是开发一个功能的时候,改或者增加一个文件的时候就commit,这样做导致一个完整的功能可能会好多个commit点,这时假如你需要把这些commit整合成一个commit的时候)時,可以考虑使用reset --soft来让 commit 演进线图较为清晰。总而言之,可以使用--soft合并commit节点
3.--mixed(默认)
回归到某个commit但是文件不会变,只是这些文件变成了差异修改,类似于你刚写完代码那一刻
(1)使用完reset --mixed后,我們可以直接执行 git add 将這些改变果的文件內容加入 index 暂存区中,再执行 git commit 将 Index暂存区 中的內容提交至Repository中,这样一样可以达到合并commit节点的效果(与上面--soft合并commit节点差不多,只是多了git add添加到暂存区的操作);(2)移除所有Index暂存区中准备要提交的文件(Staged files),我们可以执行 git reset HEAD 来 Unstage 所有已列入 Index暂存区 的待提交的文件。(有时候发现add错文件到暂存区,就可以使用命令)。(3)commit提交某些错误代码,或者没有必要的文件也被commit上去,不想再修改错误再commit(因为会留下一个错误commit点),可以回退到正确的commit点上,然后所有原节点和reset节点之间差异会返回工作目录,假如有个没必要的文件的话就可以直接删除了,再commit上去就OK了。
3.--keep
类似于--hard 会归到某一刻但是文件是会变的,但是本地的工作区和暂存区东西不会变
4. 操作之前
5. 操作之后
git stash 暂存
当你在一个分支上进行修改代码的时候,已经修改了许多,但是又要切换到另外一个分支进行修改.但是不想进行commit进版本库,可以放在文档库
- 保存所有修改过的文件(受到版本控制的)
git stash
##指定保存名称
git stash save temp
- 所有暂存列表
git stash list
- 从文档库中取出一个暂存
git stash list
- 从文档库中取出一个暂存,指定下标
下标通过git stash 返回的stash@{0} @符号后面大括号内
git stash apply 0
- 查看某个暂存中存了哪些文件
git stash show 0
- 丢弃某个暂存
git stash drop 0
git分支
Git 的默认分支名字是 master
- 查看当前所在分支
git branch
- 创建分支
分支名称为test
git branch test
-
创建分支示意图
-
切换分支
此时的 修改和提交操作都是基于test分支之上的
git checkout test
- 合并分支
master分支合并test 分支上的修改
git checkout master
git merge test
- 删除分支
不能处于test分支上删除test分支
git branch -d test
删除远程分支
git push origin --delete test
-
解决合并分支的冲突
如果处于两个不同的分支中且不存在上下游的关系, 如A和B A本地修改了index.php的第一行 B也修改了index.php的第一行 A合并B的时候就会出现冲突
git merge B
Auto-merging index.php
CONFLICT (content): Merge conflict in index.php
Automatic merge failed; fix conflicts and then commit the result.打开index.php
<<<<<<< HEAD:index.php 这部分中的内容是你当前分支中的代码 ======= 这部分内容是你要合并的B分支中的内容 >>>>>>> B:index.php 解决冲突的办法就是把这段中留一个并且删除这些符号 保存完文件之后 git add index.php 标记为冲突已解决
-
查看合并文件的状态
git status
- 列出所有远程分支和本地分支
git branch -a
- 查看分支的详细信息
如果想要查看设置的所有跟踪分支,可以使用 git branch 的 -vv 选项。 这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。
git branch -vv
- 查看当前远程厂库
git remote
- 添加远程厂库
git remote add new_base https://gitee.com/Armink/FlashDB.git
- 抓取远程厂库有而本地没有的数据
不加仓库名默认origin
git fetch new_base
- 提交当前分支到远程仓库
git push origin HEAD -u
- 克隆指定分支
git clone -b test
- 查看其他分支中的某个文件内容
git show test:index.php
-
合并参数区别
fast-forward Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移, 叫做“快进”(fast-forward)不过这种情况如果删除分支,则会丢失merge分支信息。 –squash 把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历 史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额 外的commit来“总结”一下,然后完成最终的合并。 –no-ff 关闭fast-forward模式,在提交的时候,会创建一个merge的commit信息,然后合并的和master分支merge的不同行为,向后 看,其实最终都会将代码合并到master分支,而区别仅仅只是分支上的简洁清晰的问题;然后向前看,也就是我们使用reset 的时候,就会发现,不同的行为就带来了不同的影响
标签
- 创建一个标签,基于当前HEAD
git tag -a v0.2 - 在某个commit上打tag
git tag v0.2 9646a011 - 查看标签列表
git tag -l - 查看标签详细信息
git show v0.2 - 推送标签到远程仓库
git push origin tag v0.2 - 删除标签
git tag -d v0.2
Resbase 变基
压缩合并commit
- 变基指定版本之间
git rebase -i 3a4226b
之后出现vim 编辑输入,在没有注释的地方替换
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
- 继续变基
git rebase --continue
- 终止变基
git rebase --abort
- pull 时候变基
git pull --rebase
优选
某个分支需要用到其他分支的一个或者多个提交,其他仓库的需要通过git remote add先添加
- 先看所需要的commit 所在分支的日志
git log test
- 获取某个commit
git cherry-pick 8944e27378d13a3ed779ca9960ee555ae4acbf4b
- 发生冲突的时候需要解决冲突解决完成通过来标记已解决
git add index.php
- 然后执行继续优选的命令
git cherry-pick --continue
- 取消优选的命令
git cherry-pick --abort
补丁(patch)
补丁是一个文本文件,其内容类似于git diff,但与代码一样,它也有关于提交的元数据; 例如提交ID,日期,提交消息等。我们可以从提交创建一个补丁,而其他人可以将它们应用到他们的存储库。
- 创建两个commit 之间的所有commit (开始不包括自己,结束包括自己),有多少次提交就生成多少个文件
git format-patch 【commit sha1 id】..【commit sha1 id
git format-patch 1b17da..89widawf - 将生成的所有.patch文件放到一个文件夹下,然后拷贝到待打补丁的地方
- git 查看一个 patch 文件的统计信息
git apply --stat ./patch/*.patch - Git分别提供两个命令:git am 和 git apply 来应用补丁。 git apply修改本地文件而不创建提交,而git am会修改文件并创建提交。
git am --abort (撤销之前的错误应用补丁,如果有之前错误的补丁则无法应用)
git am --keep-cr ./patch/*.patch (如有trailing whitespace 的错误,则是空白换行的问题,忽略)
git log 查看提交记录
补丁应用成功