Git使用之路

从无知的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

每一行就相当于一个命令,位置可以互换,命令是从上往下执行的。
如果移除某一行,对应的commit就丢失了,如果把所有的行都移除,整个rebase就被终止了。
一个commit拆分成两个commit
 e,git reset HEAD~, git rebase --continue
合并提交(squash和fixup)
改变提交顺序(更改行的位置即可改变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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值