建议购买原文, 小册内容:Git 原理详解及实用指南,本文学习总结用。如有侵权,感谢联系,删除。
1、基础
git clone url
git pull
git add .
git commit -m '描述'
git push
2、进阶
branch
head指向最新的commit
branch 可以理解为commit的串
git branch 查看
git branch 分支名 创建
git checkout 分支名 切换
以上两步合一步: git checkout -b 分支名
删除 git branch -d 分支名 ---如果删除分支时,没有被合并到master的分支(分支的commit串没有合并到master commit串,删了表示没有引用分支,找不到),删除时会出错,强制改为-D
引用:其实是一个个字符串,例如SHA-1码,branch指针
-----操作
git checkout master
git checkout -b 新分支
pull
第一步是 fetch,第二步是 git merge origin/HEAD
push
远程仓库的head永远指向默认的master
git push会把 branch上的路径的commit 串提交上去
出现分支---< 如果想要把本地创建的分支的commit 串上传上去,需 git push origin(远程仓库的别名) 分支名
merge
先切换到master分支git checkout master 再git merge 目标分支。
git merge 分支名 合并--<将分支的内容在master产生新的commit; ----- head领先就是空操作,落后head指向目标commit
git commit --abort 取消合并
----常用操作
git push origin login (提交开发好功能到远程,提交内容有开发用的分支和commit串)
别人:
git pull (下来)
git checkout login (查看代码,需要再commit)
git checkout master(切换主分支合并)
git pull (他人可能有上传)
git merge login(本地仓库)
git push (远程仓库)
git branch -d login(删本地分支)
git push origin -d( --delete) login(删远程分支)
本地分支
origin/master 和origin/HEAD :是对远端仓库的
master 和 HEAD 的本地镜像
add
每次修改都要git add . 因为每次提交的不是文件名,而是修改的部分
log 全部
git log -p 查看更加详细的commit信息
git log --stat 查看大致
show 具体某一个
git show 查看当前
git show 5e68b0d8/commit的引用 查看特定的提交
git show 5e68b0d8 文件名
diff 查看未提交的内容
git diff --staged(暂存区和上一条提交(本地)之间的不同)
git diff (不加选项参数)可以显示工作
目录和暂存区之间的不同
git diff HEAD 可以显示工作目录和上一条
提交之间的不同
3、高级
rebase
重新设置基础点(父的commit) ,HEAD 应该是指向的是 master (将开发好的commit提交到master)
git checkout login
git rebase master(在master分支的commit串最后加logon分支的commit串)
git checkout master
git merge login (移动master指针到最新一个)
先切到分支在执行rebase(因为你把master的commit串移到分支上,导致push不行,如下图)(与merge相反) 为了避免和远端仓库发生冲突,一般不 要从 master 向其他 branch 执行 rebase 操作。而如果是 master 以外的 branch 之间的 rebase,直接rebase.
修复上一个commit
形成一个新的commit的节点,覆盖上一个 git commit --amend
修复上几个commit
^偏移符号,有几个就是前几个 ^^
~偏移符号, ~数字
git rebase -i(--interactive) head^(界面是commit正序排,新的commit在下)
改 edit
产生冲突的原因
倒数第二次 commit和 倒数第一次commit,不能是作用同一个文件。
同一个文件 因两次提交的文件 的 对应行内容不同,导致冲突。
两次 commit 针对不同的文件 即可。
丢弃刚提交commit(本地未提交远程)
git reset --hard HEAD^(撤销也是恢复之前的上一个commit)
(远程修改:git push origin <分支名> --force可以强制让你本地的commit 覆盖远程的commit,少用,影响大)
丢弃前几个commit(本地未提交远程)
git rebase -i HEAD^^(这个方便)直接删除自己要删除的commit
git rebase --onto HEAD^^ HEAD^ branch1
移动拼接
git rebase --onto 目标commit (要拼接上的节点) 起点commit (在哪开始截取往后的节点,不包括) 终点commit (截取的终点)
---例子
将5移动到3后面
git rebase --onto 3(引用) 4 branch1
已提交到远程,修改
出错内容在私有 branch,本地删除了,远程还有commit,强行本地覆盖(千万要沟通好,慎用)
git push origin branch1 -f(force)
出错内容在master,出错的内容已经合并到master,不要强制 push ,而要用 revert 把写错的 commit 撤销(用一个新的提交覆盖,内容相反)
git revert HEAD^ (修改倒数第二个)
reset
本质:移动HEAD以及它所指向的 branch
git reset --hard(重置工作目录) branch2 (分支名)
--soft (保存工作目录,放进暂存区)
--mixed (默认):重置位置的同时,保留工作目录的内容,并清空暂存区。
checkout
本质:( checkout )指定的 commit,移动head
git checkout 分支名
git checkout HEAD^^
git checkout 78a4bc^
与reset 区别,reset是head和分支指针同时移动,checkout移动head
git checkout --detach(将head和分支分离,指向commit)
暂时保存,回来在做
git stash(保存)
git stash -u(--include-untracked)加上未追踪的文件
git stash pop(取回来)
----操作
git stash list ,查看全部stash 列表
然后 git stash apply stash@{0},恢复之前的工作。
接着 git stash drop stash@{0},
另一种解决:
可以先commit一次
假如你在 A 分支工作,并且暂存区是有东西的(add 过),这时候切换到 B 分 支,会把暂存区的东西也会带过去 B。
后果就是,如果你在 B分支 commit 了从 A带过来的暂存,A 就不会存在之前暂存的东西,也就说你在 A的工作丢掉了。哈哈哈。
找回删除之前branch
git reflog 查看head移动历史
git checkout c08de9a(引用)
git checkout -b branch1
.gitignore——排除
不想被管理的文件和目录
补充
tag:不可移动的 branch
cherry-pick:把选中的 commits 一个
个合并进来
git config: Git 的设置
Git Flow:复杂又高效的工作流