作为一个4年的程序员,很多基础一知半解,很惭愧.想来想去,自己后知后觉,到毕业一段时间,才知道这个行业比较适合我.
选择将git 整理一番,磨刀不误砍柴工嘛.
参考书籍 https://git-scm.com/book/zh/v2
首先是clone 一个项目
- git clone
git clone git@xxxxxxxxxxxx.git
- git status
然后修改文件 index.md git 马上会发现和之前提交到git的文件差异(命令 git status)
git diff
此时想看详细的差异内容(命令 git diff)
git add
然后提交差异的内容到 git 暂存区 git add . 或者文件 index.md
再次git status 查看,差异的内容变成绿色了,这时候,再次使用命令 git diff ,什么也不显示,但是用
git diff – staged 显示了刚刚修改的内容git commit
https://blog.csdn.net/engineer_james/article/details/80866842
因此,git diff 比较的是本地修改和暂存的区差异(如果没有暂存内容,就和已经提交的内容比较)
而git diff –staged 比较的是 暂存区的内容和 已经提交的内容
如果此时发现 不需要这个修改,需要将暂存区的内容,恢复,就用(命令 git reset )
再次用git status 发现index.md 依然变成红色,变成了本地修改
PS: 如果有多个修改文件进入了暂存区,只想回撤一个文件的修改,那么可以使用
git reset HEAD <file>...
git rm && git mv
在git 中删除文件和移动文件 git rm index.md 或者 git mv index.md indexbk.md 和linux 差不多git log
关于 git log 教程中有很多参数,但是我之喜欢用 git log 不带参数, 或者干脆 直接gitk 图形化界面,直接看commit 记录git checkout
如果本地修改了文件,但是改乱了,现在想恢复到初始状态,就需要用 (当你使用 git status 会提示你)
git checkout <file> 或者 git checkout .
git branch
如果使用 git branch -a
可以看出 远程服务器是origin ,他的head 指向 远程仓库 master 分支,而本地分支是master,(使用git branch 就可以知道)git remote
使用git remote -v 就可以知道远程分支的fetch 和 push 地址
git fetch [remote-name]
如果想在提交代码前更新本地的代码,可以使用git fetch origin ,但是更新,并不会把合并到本地的代码,需要手动合并
但是 git merge 是合并操作
git fetch + git merge = git pull
这里还有一篇写的不错 https://blog.csdn.net/qq_36113598/article/details/78906882git push [remote-name] [branch-name]
commit 后,可以通过 git push origin master 将本地master 分支提交到 origin 仓库git remote show [remote-name]
查看远程仓库信息,可以看到 fetch 和 push 地址, head 分支是master 并且 track 远程master 分支,已经更新到最新分支创建
git branch <branch-name>
git checkout -b <branch-name> //创建分支,并且切换过去
git checkout <branch-name> //切换分支
- git merge
合并 a 分支到 master 分支
git checkout master //首先切换到 master 分支
git merge a //最后,合并a 分支到master 分支
上面是没有冲突的情况
但是一旦出现冲突,例子中,就需要手动解决 ==== 分割线上面和下面有冲突
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
- 跟踪远程分支
git checkout -b [branch] [remotename]/[branch]
git checkout --track origin/master
git branch -u origin/master
git branch -vv
可以知道多有分支跟踪远程分支的情况
- git rebase
git checkout a
git rebase master //git rebase 到目的分支 ,但是此时 head 在a 分支
git checkout master //head 在master 分支
git merge a//a 合并到 master ,此时master 分支在最前面
详细看 https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA
最后提交历史变成直线,没有分叉
- git format-patch
git format-patch -1 <commit id> 单独commit 的patch
git format-patch <commit id> 不包含当前commit 以来的提交分别生成patch
git format-patch <commit id1>..<commit idn> commit id 之间的patch 分别列出来
- git apply
git apply --check 0001-xxxx-fix.patch //检查能否正确应用patch
git apply 0001-xxxx-fix.patch //应用patch
- git cherry-pick
如果不想变基即 rebase,那么就用cherry-pick,
特性分支中的某个提交,或者特性分支中只有一个提交,而你不想运行变基时很有用
可以将某特性分支的某一个commit 应用到当前分支,创建的时间点,不一样
git cherry-pick e43a6fd3e94888d76779ad79fb568ed180e5fcdf
- git show
使用 git show <commit id>
查看某一commit id 的内容
还有很多git 高级用法,在android 源码开发的时候会遇到 比如
HEAD:refs/for/mybranch和refs/heads/mybranch 区别