从无知的Git宝宝到自如使用
一.基本配置
1.在安装git 后,配置config,在本地的.ssh目录下的config目录中添加
Host*
KexAlgorithms+diffie-hellman-group1-sha1
git config --global user.name "aaaa"
git config --global user.email aaaaaa@qq.com
2.各种平台换行符不一致,git提交时统一转换
git config --global core.autocrlf true
git config --global core.autocrlf true
3.配置changed-id
scp -p -P 29418 aaa@scm.qq.domain:hooks/commit-msg .git/hooks/
4.SSH
cd .ssh
vi id_rsa.pub
二.基本使用
首先从远程仓库克隆代码,这样代码就在本地了
git clone ssh://aaaaaa@bb.cc.domain:11111/qqandroid
以后每次打开代码就拉去最新的代码,尽量不要用git pull,用下面的任意一行
git fetch origin
git rebase origin/master
提交代码前确保自己所在的分支为当前分支,查看所有的分支
git branch [--all]
切换到master 分支
git checkout master
修改结束后,查看当前的状态
git status
查看修改的地方有哪些
git diff
添加进分支
git add 类名或者使用git add . 添加所有的
提交
git commit -s 进入vi界面,进行编辑并注释,此时需要了解Vi编辑命令
或者直接 git commit -m "注释"
退出后,拉取最新的代码
git fech origin
将当前的分支置于顶部
git rebase origin/master
查看当前分支情况,会出现图形界面是否在最顶
gitk
提交代码在分支
git push origin HEAD:refs/for/master
提交后,查看提交的分支
git log
三.进阶
1.若修改了多个类,但是只想提交部分类,并不全部提交,该怎么办呢
有很多解决办法:
a.在commit 后,使用git stash暂时保存当前的修改,在push 之后使用git stash apply 恢复到原来的
b.先将不提交的用git checkout 类名命令还原成未修改状态,将要提交的类用git add 类名命令,或者更简单的用git commit -a 一次性提交全部命令
2.同一天对同一部分做了修改,前一次提交生成了一个patch,第二次提交时想将这两个合并提交
a.生成一个patch 的两个patch set
查看提交记录
git reflog
回到我想找的提交
git checkout 号码
返回到两次提交之前的一次提交
git reset 号码
git reset --hard
rm -rf
rm -rf .git/rebase-apply/
没有冲突后"git rebase --continue
复制commit的号码(用git log 查看)回退到patch set 1 之前的一次提交
git reset 号码
在commit后添加上第一个patch set 的changeId
b.直接合并成一个patch
查看提交记录
git log
返回代第一个commit之前的一个commit,把后面的提交变成未提交的状态
git reset --hard 3c5fef11eb9389f3575f8a11dda2deb3b79aa668
或git reset HEAD~n,n表示第几个
添加当前未提交的修改
git add .
查看当前状态,如果修改的都包含就再次commit
git commit -am
c. 到要合并的commit之前的那个commit
git checkout号码3
合并两个commit
git merge --squash 号码1 号码2
一起提交
git commit -a
还有一种方法,git rebase –i HEAD~n
将第二个pick修改为squash或者s,然后输入":wq”退出
这时git会自动将第二个提交合并到第一个中去。并提示输入新的注释
提交到远端,运行命令
git push --force origin master
c.在第二次commit 时 ,采用另一个命令在原有的基础上进行提交,用于对永阳的问题又做了修改
git commit --amend
3.处理冲突
a rebase 过程中出现冲突
git rebase 出现冲突,例如both modified,多人同时修改一个文件
查看那个文件被修改了
git status
打开冲突文件,手动处理,解决冲突
git add 冲突的类名
git rebase --continue
4.现在改的代码想提交一个进入原来的分支,但是那个分支已经merge或者abandon了
查看现在的分支状态
git status
若有修改,先把现在的修改提交保存到当前分支(master)
git commit -am "new"
看下是否提交
git log
拉取最新代码,detach from master 进入另一个分支
git fetch ssh://xiongcuihua_sx@scm.qiyi.domain:29418/paopao_android refs/changes/88/119288/3 && git checkout FETCH_HEAD
From ssh://scm.qiyi.domain:29418/paopao_android
git cherry-pick 名称(现在的提交,上面还有一个new)
查看提交情况
git log
查看具体修改的类的情况
git show --stat
查看修改的内容
git show
将new的commit整合到新的分支
git commit --amend
查看这次提交的修改
git log -1
git cherry-pick 名称(new 所对应的那个commit)
回到merge过得提交之前的那次commit
git reset 1ad270a0acb759c335631044a71ef32157e4e092
查看状态有很多红色的,没提交的
git status
重新添加
git add .
提交
git commit -a
git rebase origin/master
git push origin HEAD:refs/for/master
回到master
git checkout master
切换分支
git fetch ssh://xiongcuihua_sx@scm.qiyi.domain:29418/paopao_android refs/changes/84/119984/1 && git cherry-pick FETCH_HEAD
From ssh://scm.qiyi.domain:29418/paopao_android
就OK了
5,应注意的细节
本来提交了一个patch,还没有push,但误操作(如 git rebase --skip)当看不到当前的提交,可以这样做:
查看我的提交
git reflog
切换到我的提交,此时会生成一个新的分支
git checkout e681822(我的提交),所以就会有三个分支,远程的,本地的,现在新建的
将新建的分支上的修改和本地同步
git rebase master
提交代码,此时还没有和远端同步的
git push git origin HEAD:refs/for/master
将本地和远端代码同步
git fetch origin
git rebase origin/master
git fetch ssh://aa@scm.qiyi.domain:1/3444 refs/changes/08/121008/2 && git cherry-pick FETCH_HEAD
能不用git pull就不用,很容易产生冲突
6.一些技巧
打patch
git format-patch -1
git am 0001-Common-add-fetch-network-api.patch
新建分支
git checkout origin/master -b master0923
删除master
git branch -D master
给分支重新命名
git branch -m master0923 master
复制config的内容
cat ~/.gitconfig
编辑config的内容
vi~/.gitconfig
配置命令
[alias]
co = checkout
cp = cherry-pick
br = branch
st = status
l1 = log -1
pm = push origin HEAD:refs/for/master
ap = apply
cm = commit
rbm = rebase origin/master
f = fetch origin
rh = reset --hard
sa = stash apply --0
Git修改提交历史
git log --pretty=format:”%h,%s” //--pretty=format 表示格式化输出,%h 表示提交对象的简短哈希字串,%s表示提交说明)
(为了方便后面的展示git config --global alias.last "log --pretty=format:"%h,%s"",之后如果需要查看log信息,git last 或者 git last -n即可)
git rebase -i //交互式的运行变基
git rebase -i HEAD~3 //修改最近三次提交
git rebase -i --root //git log的显示顺序相反,commit显示顺序刚好和git log的显示顺序相反
依次解释一下Commands命令:
p, pick = use commit: 直接使用commit 不做任何修改,其中p 是pick的缩写,以下雷同;
r, reword = use commit, but edit the commit message: 使用commit,但是会更改commit 信息;
e, edit = use commit, but stop for amending :使用commit,但是遇到此命令时会停止合并;
s, squash = use commit, but meld into previous commit: 使用commit,但是会合并到前一个commit中;
f, fixup = like "squash", but discard this commit's log message:和squash类似,但是会抛弃commit的log信息
x, exec = run command (the rest of the line) using shell:使用shell运行命令
d, drop = remove commit:丢弃commit
(参考 : http://www.jianshu.com/p/67f20d19605a)
7.第一个patch abandon了,第二个patch 已经可以merge了,要去掉第二个对第一个的依赖
改变commit的顺序
具体做法:切到远端master上,cherry-pick第二个,在push。若在修改,并且没有被merge,则在原来的基础上--amend,但要把change-id删掉,(如果不是abandon的场景是不需要删的),否则还是旧的,旧的又是abandon状态,就提交不上去了。
8.开分支做两件事
比如我正在写需求,然后老大突然给了个紧急bug 让我修复,这个时候可以开分支来做。首先把手上的需求代码commit掉,然后从远端分支上开新分支git checkout origin/master -b branch2,名字自定,然后在新分支上改bug ,改完后commit,在push,在切回第一个分支git checkout branch1,继续写需求,改变当前的branch的名字可以使用,git branch -m branchname
更好的理解和描述请参考:https://github.com/FrannyZhao/FrannyZhao.github.io/blob/master/CodeManagement/git.useful.skills.md