写在前面 -- 写这篇文章的契机
GIT:是一个每天都会用到的工具。每天都用不等于用得好,这篇文章将会记录更新git中遇到的问题
场景1
背景:项目环境复杂,项目分为新区和旧区,旧区代码为基础代码,新区代码是从旧区拆分出来的,一般情况下,如果新旧区都上线,需要从旧区拉取分支
问题:同一个问题在新旧区都有,迭代需要同时发布,本应该旧区拉分支,但是开发时从新区拉了分支,现在想合到旧区,新区代码无法向前合并到旧区,怎么办。。。
小白思维:旧区拉一个分支,重新修改相关问题。浪费时间,迭代发版之际重新修改代码,容易出错,不科学
GIT高级思维:
1.git log
a.git log branch1 ^branch2:查看branch1中有的commit,而branch2中没有的commit
b.git log branch1..branch2:查看branch2的log比branch1的log多提交了哪些内容
c.git log branch1..branch2:查看branch2的log比branch1的log区别,并不知道哪个分支提交的多
d.git log --left-right branch1..branch2:查看branch2的log比branch1的log区别,可以查看提交的分支, <表示branch1,>表示branch2
2. git diff:比较文件之间的不同
a.git diff commit1 commit2 commitId可以取前六位
b.git diff --name-only commit1 commit2
c.差异文件打包:git diff --name-only commit1 commit2 | xargs tar -zcvf 文件名称.tar.gz
d.git diff commit1 commit2 -w 忽略所有空格
e.简略写法
HEAD:当前提交;
HEAD^:上一次提交
HEAD~X;
HEAD~0:当前提交;
HEAD~1:上一次提交
。。。依次类推
3.git show
查看某次commit的具体提交内容
a.git show commitID
b.git show HEAD:查看HEAD标签当前指向提交的完整信息
c.git show branchxx:查看branchxx分支最新一次提交的完整信息
d.git show branchxx^;git show branchxx~1:查看branchxx分支最新一次之前一次提交的完整信息
。。。依次类推
4.git cheery-pick
对于多分支的代码库,将代码从一个分支转移到另一个分支,正常我们用git merge 但是如果我们只需要部分代码变动(某几个提交),就可以使用cherry pick
a.git cherry-pick commitID:某个commitID转移到当前分支,一般放在最后
b.git cherry-pick branch:某个分支的最新提交转移到当前分支
c.git cherry-pink commitID1 commitID2一次转移多个提交
d.git cherry-pick A..B 转移A到B的所有提交,A的提交必须早于B,并且不包含提交A
e.git cherry-pick A^..B 转移A到B的所有提交,A的提交必须早于B,并且包含提交A
cherry-pick时代码冲突的解决办法
a. git cherry-pink --continue
解决代码冲突之后,第一步 git add .,然后使用git cherry-pink --continue,让cherry-pick继续执行
b.git cherry-pick --abort:放弃合并,回到操作前的样子
c.git cherry-pick --quit:退出cherry-pick,不回到操作前的样子
5.git stash
使用场景:在A分支上写代码,此时B分支需要紧急修复bug,此时A分支的代码不提交,就可以放在暂存区,git stash存起来,然后去B分支进行bug修复,修复工作完成后,回到A分支拿出暂存的文件内容
git stash之前的status
git stash
git stash之后的status
git stash list
恢复暂存的状态的命令:
a.git stash pop:不会在git stash list保存记录
git stash pop之前
git stash pop之后
b.git stash apply:会在git stash list保存记录
6.git tag
每次合并分支发版之前给即将合并的主分支打tag标签,给当前版本做个标记,以便回退到此版本。如果使用commit-sha1,大家记不住sha1码,所以用tag标签记录