git的常用操作指令和错误

来源:互联网 发布:ubuntu安装拼音输入法 编辑:程序博客网 时间:2024/06/10 03:40

一、在使用git(SourceTree)进行代码合并的时候,经常会遇到冲突(conflict),git的命令行界面和Source Tree的界面解决冲突的能力有限,UI也不友好,这时候可以使用外部工具帮助解决冲突。外部merge和diff的工具很多,我使用的是XCode自带的FileMerge


  1. 首先确认FileMerge已经随XCode安装了:打开XCode,并随便打开一个工程,在Xcode -> Open Developer Tool目录下应该能看到FileMerge


  1. 如果是用的SourceTree,打开SourceTree的Preference,选中Diff这个tab,下方External Diff/Merge选项里,“Visual Diff Tool”和“Merge Tool”都选中FileMerge(如果你喜欢其他工具也可以,流程都是差不多的,就是UI不太一样)

如果是用的git命令行,这里有个说明:

http://www.gitguys.com/topics/merging-with-a-gui/





  1. 冲突解决:如果在merge的时候碰见冲突,SourceTree会在merge结果里面显示冲突的文件:

这里显示了两个分支上同时期的两个改动,分别用HEAD(表示当前这个分支)和另外分支的名字表示,这时就可以启动外部工具帮助解决冲突:


右键冲突文件,选择Resolve Conflicts - > Launch External Merge Tool,这时候FileMerge就应该启动了。


FileMerge打开后,可以看到有些行已经自动merge了,这些不用管行不用管。直接找到有conflict(红色)的行。可以使用顶菜单Find->Go to Next (Go to Previous) -> Conflict,定位到冲突。然后用右下角的Actions菜单,选择保留哪个版本,或者保留两个版本(以及先后顺序)



所有冲突都解决完了后,按CMD+S保存,然后CMD+Q退出。这时SourceTree里面这个文件已经从原先冲突状态,变为正常的Staged状态,表示可以commit了。然后Unstaged files里面还会留下一个.orig备份文件,删除即可。


应该注意到的是,如果改动很复杂,合并时需要添加或者修改代码的,FileMerge也不能很好的解决冲突,还是要到Xcode里去改源文件,改完后记得把<<<<<<<<<<<<<  =========== >>>>>>>>>>删掉,然后在SourceTree里面Mark Resolved即可。


二、重命名远程分支

在git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。

例如下面的例子中,我需要把 devel 分支重命名为 develop 分支:

删除远程分支:

$ git push --delete origin devel

To git@github.com:zrong/quick-cocos2d-x.git

 - [deleted]         devel

重命名本地分支:

git branch -m devel develop

推送本地分支:

$ git push origin develop

Counting objects: 92, done.

Delta compression using up to 4 threads.

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

Writing objects: 100% (58/58), 1.38 MiB, done.

Total 58 (delta 34), reused 12 (delta 5)

To git@github.com:zrong/quick-cocos2d-x.git

 * [new branch]      develop -> develop



三、在使用git branch命令查看当前环境所在的开发分支时,如果出现*(no branch),则表示当前不处于任何分支,这时可以通过如下几种方法处理,以便于后续项目版本的管理:

1:git checkout -b 分支名;此时新创建的分支与*(no branch)软件一样

2:如果想将*(no branch)合并到主分支master,则首先执行git log命令,记住第一行的id号,然后执行git checkout master命令,此时出现的第一行信息中也会出现一个id号,与之前执行git log中第一行出现的id号是一致的,此时就已经切换到了主分支上来了,然后执行git merge id将*(no branch)软件合并到主分支;

如果主分支与*(no branch)软件内容有差异的文件比较多,则建议使用第一种方法,如果有差异的软件不多,则可以使用第二种方法。

 

亦可参考http://serverfault.com/questions/56722/git-seemed-to-be-in-no-branch-and-then-lost-my-changes







1 0
原创粉丝点击