您的位置:首页 > 移动开发 > Android开发

Git 用法小结

2016-01-21 16:54 381 查看
Git是一个开源的代码管理的强大工具,能很好的实现处理团队协作开发时的代码管理功能。

下面将有关git的常用操作做一个总结:

1)合并两次commit的提交纪录流程:

第一步: git rebase -i HEAD~2  //2就代表当前git log中最顶端的两次commit

第二步:弹出vi的编辑窗口,看到两行已pick开头的message,此时需将合并的commit message之前的pick改为squash或简写s,则合并后的commit msg为此时保留的pick之后的那一行。编辑完后命令行执行:wq

第三步:弹出commit msg的编辑窗口,把不要的msg行删掉,执行:wq保存退出。此时执行git log可以看到本地已经合并了。

第四步:push的远端服务器。执行git push -f,同步到远端git服务器。

注意:如果执行完第一步之后,弹出的vi编辑界面不正常(比如无法执行命令行),则可以执行git config --global core.editor /usr/bin/vim,则可以畅快的编辑了。

2)git 查看某一次提交的修改了哪些文件:

git log --oneline --stat (除了log信息,还包含修改文件的明细)

git log --oneline (依次显示commit的log信息,仅一行)

3)git回退服务器提交:

git reset --hard <commit_id>

git push origin HEAD --force

4) git 修改commit信息

对于修改最近一次提交的情况:

git commit --amend即可弹出vi修改编辑界面,修改完成:wq退出即可,如果代码已经push的origin,就要推到远端,如果分支对应,则执行

git push -f

对于修改中间某一次的信息,比如倒数第三次:

git rebase -i HEAD~3,之后会出来三行

这个命令出来之后,会出来三行东东: 
        pick:******* 
        pick:******* 
        pick:******* 

将需要修改的行的pick改为edit或e,然后wq保存退出,此时git log会发现刚修改为edit的commit已变为最新的提交,

之后执行git commit --amend ,就跟上一种情况一样了。修改完成还要把顺序理顺过来,执行:

git rebase --continue ,如果已经push到远端,则还需执行git push -f

5)git 撤销某次提交(只回退某次commit,而本地代码不会改动)

git reset --soft commit-id

6)重命名本地分支:

git branch -m oldbranchname newbranchname

7)删除远程分支:

git push origin :old-local-branch-name

或者git branch -r -d origin/branch_name

如果在删除之后使用git banch -a命令依然可以看到远程分支,则可执行git remote show origin查看分支状态:

kongbo@baal:/workspace/kongbo/release/light-vinci-en$ git remote show origin

* remote origin

Fetch URL: /workspace/vinci/vinci-light.git/

Push URL: /workspace/vinci/vinci-light.git/

HEAD branch: master

Remote branches:

factory tracked

master tracked

normal tracked

normal_international tracked
refs/remotes/origin/normal_test stale (use 'git remote prune' to remove)

Local branches configured for 'git pull':

master merges with remote master

normal_international merges with remote normal_international

Local refs configured for 'git push':

master pushes to master (local out of date)

normal_international pushes to normal_international (up to date)

可以看到红色标注的分支是不存在的,需要执行提示命令清除掉相关记录

执行

kongbo@baal:/workspace/kongbo/release/light-vinci-en$ git remote prune origin

Pruning origin

URL: /workspace/vinci/vinci-light.git/

* [pruned] origin/normal_test

可以看到,该分支记录在远端被彻底清除。

8)本地分支推送到远程:

git push origin  new-local-branch-name: new-local-branch-name

$ git push -u origin master


上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。
$ git config --global push.default matching
# 或者
$ git config --global push.default simple

9)git推送代码遇到权限问题,日志如下:

kongbo@baal:/workspace/kongbo/release/vinci-light$ git push

Counting objects: 33, done.

Delta compression using up to 24 threads.

Compressing objects: 100% (29/29), done.

Writing objects: 100% (33/33), 22.06 KiB | 0 bytes/s, done.

Total 33 (delta 11), reused 0 (delta 0)

remote: error: insufficient permission for adding an object to repository database ./objects

remote: fatal: failed to write object

error: unpack failed: unpack-objects abnormal exit

To /workspace/vinci/vinci-light.git/

! [remote rejected] normal_international -> normal_international (unpacker error)

error: failed to push some refs to '/workspace/vinci/vinci-light.git/'

遇到这种问题需要登录到服务器端git仓储的根目录,具体到上述的问题就是/workspace/vinci/vinci-light.git/

然后执行如下操作:

ssh登录服务器

cd/workspace/vinci/vinci-light.git/

sudo chmod -R g+ws *

sudo chgrp -R mygroup *

git config core.sharedRepository true

通常在执行完红字标示的命令就可以在local端推送了。

针对该问题的原因分析可参考http://www.91r.net/ask/6494913.html这篇文章。

10)查看某个文件的改动记录:

git log --pretty=oneline file
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息