git总结

来源:互联网 发布:html5 微场景源码 编辑:程序博客网 时间:2024/06/03 13:22

Git总结-Zong

 

任务:

熟悉sourceTree  *

Git merge(准确应该叫commit合并)未完成

 

Git分支:有一个或多个commit组成的有向无环图,这样说比较准确,因为如果说成一条线的话,如果有merge的时候是会有分支。

Commit的合并:发生在merge rebase的时候。

 

一,当前分支没有修改(意思是commit后就没有再操作),要合并的commit修改

1)如果要合并的commit里有的文件,当前分支没有,则系统直接自动合并(会把当前分支没有的文件直接加进来)

2)如果要合并的commit删除了当前分支有的文件,系统会自动合并,直接删除,除非当前分支对删除文件有修改,那就会产生冲突感觉这个好危险

3), 要合并的commit对共有一文件删除,增加行 ,系统也会自动合并(增加,删除对应行)

4)要合并的commit对共有文件Update(修改)行,系统不能自动合并,此时会产生冲突

 

二,当前分支不但commit了,而且在commit后还修改了 ,要合并的commit修改

1)

 

 

----------------------------------------------------

git clone

克隆下版本库中的整条master分支,也仅仅只有master分支 并且master已经与远程Master有追踪关系。

 

git branch dev

建立分支的最简单操作,不会附加任何操作

 

git branch --trackdev origin/dev

建立本地dev 并且与远程建立了追踪关系,但不会切换到新分支

 

gitcheckout --track -b dev origin/dev

此命令会克隆下整条远程dev到本地,并且会建立追踪关系,切换到新分支(经常用)

 

git push

此命令跟git的版本有关,在git 2.0之前是matching模式,git 2.0之后是simple模式。 Simple模式是只push当前分支 matching模式是push所有有追踪关系的分支。

 

git push origindev

此命令可以推送本地dev分支到远程dev分支,如果服务器没有dev,会在服务器建立一个dev分支,注意它是不会建立追踪关系

 

 

git fetch

只获取远程对应分支的更新,并不会merge (推荐)

这里说下git fetch两种用法,如下:

1)

git fetch origin master

git log -p master.. origin/master

git merge origin/master(你也可以选择rebase)

 

2)

git fetch origin master:temp

git diff temp

git merge temp(你也可以rebase)

 

 

 

 

git pull

此命令分两步小操作,1,git fetch 2,git merge

git pull 会把你没有的commit全拷贝下来

git pull --rebase

用rebase方式合并远程分支,不加--rebase,那么默认是merge方式

 

git branch--set-upstream dev origin/dev(我常用)

此命令可以在没有建立追踪关系的分支,建立追踪关系。(特别好用)

 

git branch--set-upstream-to=origin/dev dev

此命令可以在没有建立追踪关系的分支,建立追踪关系(最新方式)

 

git push--set-upstream dev origin/dev

不但push,而且会建立追踪关系

 

git push –tags

git push默认不会推送tag到远程分支

 

 

 

git show commitID

可显示具体的某次的改动的修改

 

git diff

 

 

git revertcommitID (http://hittyt.iteye.com/blog/1961386)

 上面我们基本上演示了一个标准的revert场景(包括了冲突解决),从这个过程可以看出,gitrevert和SVN的逆向merge几乎如出一辙,就是将你需要回滚的那次commit所做的所有操作,反向操作一次,然后重新做一一个单独的commit对象进行提交。这个过程是否发生冲突,就取决于你的修改了。请注意,这个过程你虽然回滚了你不想要的修改内容,但是你没法抹掉那次commit在history中的信息,请注意上图的第三行,他依旧坚挺的躺在那里。这个也是git revert的特点。

 

 

查看分支追踪关系

gitconfig -l | grep "branch.分支名"

也可以直接去.git/config中查看

 

查看远程分支

git branch -r 此命令经常用于确认你推送的分支是否已经成功推送到远程版本库

 

git log 分支(既可以本地分支,也可以远程分支)

git log dev

git logorigin/dev

1)一般你push后想看是否push成功,就可以用git log origin/dev来查看  commit是否已经Push成功

2)还有特别要注意的一点是:git log origin/dev看到的是你上次Pull/Push 时候留下的origin/devlog记录,如果要更新服务器的origin/dev log记录,

必须先 gitfetch origin dev然后再git log origin/dev此时看到的才是服务器     最新的log记录

 

git log (要常用git log)

如果后面什么都不接就是当前分支

 

gitlog -p <filename>查看某个文件的修改历史

git log -p -2查看最近2次的更新内容

git log -p dev..origin/dev(一般和fetch 一起用)

对比两个分支的不同,一般fetch后,要就要查看一下区别,然后再merge

 

 

合并两个分支,两种方法

1,gitmerge

1)获取另一个分支的所有commit,并用另一个分支的最新commit与当前最新commit合并出一个新commit(fast-forword除外,不过一般都会禁用fast-forword

2)merge可以保存合并的信息

 

2,gitrebase

       1)把一个分支的commit应用到当前分支,方式是,把当前分支的所有commit全移动到另一个分支的最前面,并且rebase不会保存合并信息

       2git rebase xx会把当前分支的所有commit一个一个放在xx分支的前面,第一个放到xx分支前面的commit会和xx分支的最新commit合并,然后第二个放过来时,又和这个xx分支的最新commit合并(其实这个xx分支最新的commit就是第一个和xx分支最新合并出来的)

       3)git rebase xx 其实可以理解为当前分支的base要改为xx的最新commit

       4)rebase 母的是为了保持服务器树的整洁。会是一条线(企业一般用rebase基本是为了这个)

       5)如果merge的话就会有合并记录,即会有分支。这就不方便管理

 

以上我都已经做过实验了。

 

 

 

 

切换分支,和回退版本的时候基本会用到的命令,git stash

 

git stash list

显示stash 列表

git stash clear

清空stash

 

git stash save “message”

暂存当前工作区和Index的修改到对应分支的stash

gitstash save –a “message”

会连新建的文件都保存进stash如果不加-a新建的是不会被保存的!

你也可以用-u实现同样功能即gitstash save –u “message”

 

git stash popstash@{id}

恢复对应分支的stash,并且会删除在stash list中的对应stash@{id}

 

git stash applystatsh@{id}(我基本不会用)

恢复对应分支的stash,但不会删除在stash list中的对应stash@{id}

 

 

stash有如下几种处理方式:

1. add并且commit,再checkout,提交到当前分支

2. add但不commit,可以stash,然后checkout回来之后stash apply,在commit,提交到当前分支

3. add但不commit,也不stash,直接checkout,然后再commit的话,记录就在切换分支下面。

其本质一个本地的git repo只有一个工作区和暂存区,但是有多个分支的提交区,而我们的checkout只是将HEAD指针从一个分支切换到另一个分支。附图如下:

 

 

 

gitreset commitID(会保留当前修改)

此命令会切换到指定commitID,并且把commitID的工作区修改为当前commitID的工作区,由此在工作区会产生修改,但修改并未添加到stage(暂存区),你可以用git checkout -- file来撤销工作区的修改

 

git  reset –soft commitID(会保留当前修改)

此命令会切换到指定commitID,并且把commitID的工作区修改为当前commitID的工作区,由此在工作区会产生修改,并且修改会添加到stage(暂存区).

 

 

git reset commitID–hard(慎重,不会保留当前修改,一般可以stash后再reset --hard)

此命令会切换到指定commitID 切换后工作区就是指定切换commitID的工作区

 

分支之间切换和同一分支commit间切换时候,工作区,工作区和暂存区修改,修改情况

gitcheckout分支之间的切换与git reset的在同一分支的回退的异同:

本质:git checkout git reset 切换commit的异同:

相同点:

       都会保留修改(工作区修改和暂存区修改)

不同点:

       分支之间切换

1)      不会保留当前工作区。而是会把工作区直接用切换目的分支的commit的工作区覆盖。

2)      保留工作区,暂存区的修改。

3)      可以用git checkout分支名 –f 来放弃当前分支的修改,强行切换到目的分支。

       Reset版本回退,(这里是指软reset

1)        会保留当前工作区,然后与回退目的commit的工作区对比再产生工作区修改。

2)        并且reset还回保留当前工作区和暂存区的修改

3)        可以用git reset commitID –hard来强行切换到回退的目的commit,并且不保留当前工作区,工作区和暂存区修改

 

 

 

git 怎么把当前分支搞到另一个共享版本库,直接添加远程仓库,然后push过去,就可以了?对的,就是如此

 

git 建立共享仓库,其实就是建立一个裸仓库,所谓裸仓库就是没有工作区和暂存区,只有分支。因为共享版本库没有必要拥有工作区和暂存区。

 

Origin/master本质到底是本地分支还是真实的远程分支?

答:我觉得是特殊的本地分支,特殊在,不能切换过去,更不能在origin/mastercommit,但可以fetch远程服务器分支到origin/master,也可以push的时候更新origin/master

 

 

常识:

共有(public)的库是pull clone不用密码,push 要密码 代表-gitHub

私有(private)的库是pull clone push都要密码 代表-osChina

当然repo是可以设置用户访问权限的(只读,读写等)

 

 

gitcherry-pick commitID

直接合并指定的commitID,此命令用于不要整个分支合并,只要某个特定的commit合并的情况。

 

Git tag使用

git标签分为两种类型:轻量标签和附注标签。轻量标签是指向提交对象的引用,附注标签则是仓库中的一个独立对象。建议使用附注标签。

git tag # 在控制台打印出当前仓库的所有标签

$ gittag -l ‘v0.1.*’ # 搜索符合模式的标签

 

# 创建轻量标签

$ git tag v0.1.2-light

# 创建附注标签

$ git tag -a v0.1.2 -m “0.1.2版本

创建轻量标签不需要传递参数,直接指定标签名称即可。

创建附注标签时,参数aannotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。

 

打标签不必要在head之上,也可在之前的版本上打,这需要你知道某个提交对象的校验和(通过git log获取commitID)。

# 补打标签

$ git tag-a v0.1.1 9fbc3d0

 

通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作:

$ git push origin v0.1.2 # v0.1.2标签提交到git服务器

$ gitpush origin –tags # 将本地所有标签一次性提交到git服务器

 

 

Git  怎么调到tag ,并且从tag创建分支

gitcheckout 标签名(也可以git checkout commitID

此时会指向打标签名对应标签时的代码状态,(但现在处于一个空的分支上)切换到标签commit,并且此时会处于detached HEAD状态,然后可以用

git checkout–b new_branch_name 来从tag处,创建新分支

 

更牛逼的,如下:

Git 怎么到指定commit创建分支?

gitbranch new_branch_name commitID

gitcheckout –b new_branch_name commitID

以上两个命令都可以从指定的commitID处创建一个新的分支

 

tag可以加多个

 

假如要合并本地两个分支(AB),

1)          可以直接本地的A merge  B分支来合并

2)          也可以A pull远程服务器的B分支来合并

 

gitbranch –d –r origin/dev 删除远程分支

 

gitmerge 时候如果当前分支有修改会怎样?

修改不会怎样,一直保留在那里

 

经历的两个典型错误

1)       git checkoutdev注意这里我打错checkout了,但我没注意到,以为自己已经切换到dev。结果以后所有做的操作我都以为是做在dev分支上的,但结果却惊奇发现我居然把所有操作都坐在master分支了,因为我还留master分支上。。。

2)       git checkout dev分支,但在这之前master分支的工作区上又修改,然后切换过来修改会保留,然后我没注意,然后接着在devtouchz.txt git add . git commit –m “add z.txt” 结果惊奇发现我把之前master带过来的修改都commitdev分支了。。。。。

3)       综上,切记切换分支前必须git stash,切记每一个git checkout都要特别留意,是否切换成功,是否带修改过来。

特别在命令行,打错命令很容易被忽略的

 

 

新人流程:

会给我(新人)一个git版本库 url ,账号,密码,

1)          gitclone url

2)          检出develop分支。

3)          再从develop某个commit开自己的分支。(或者有人帮你开好分支

4)          然后在自己的分支里做自己事情,做完让人合并到develop分支就行

新人禁忌:

1)切记不要随意切换到别的分支,更不能动任何分支,除了自己的分支

2)切记pull要用rebase

3)要修改公共文件前,必须先从服务器更新,并且通知同事我要修改了,让别人先不要修改该公共文件,最后你终于可以修改了!(其实git的话平时都在自己的分支里做事情,只有合并代码才会冲突。这条禁忌是给svn的比较多。这也是git的优势)

 

 

 

svn

svn项目初始化:

1,       新建Xcode项目第一次commit的时候cornerstone会提示要ignore,此时你必须选择ignore要cornerstone帮你忽略

2,       还有两个xcuserdata目录要自己手动忽略(都是用cornerstone)

3,       忽略有三部:

1,       先delete (是为了让这个文件不要svn管理,并且delete后一定要commit,因为服务器里的你也有delete掉)

2,       commit

     3,ignore

4,       1,可以随便修改试着commit看是否有多余的东西要你commit

2,添加断点,再试着commit看是否有多余的东西要你commit

3,有就没有忽略干净

5,       xcuserdata目录中是Xcode自动帮我们记录的东西,如:

1,       当前打开了那些文件

2,       目录的打开结构

3,       断点信息(这里特别强调,断点信息必须忽略,否则别人会用到你的断点!

svn注意点:

1,       第一次checkout 的时候要选择1.7版本(切记)

2,       静态库Xcode不能自动add 要到命令行手动svn add

3,       storyboard冲突要特别注意

 

svn避免冲突

1,       核心:尽可能本地与服务器代码同步

1,       修改前,先update

2,       修改后,立即commit

3,       尽量修改不多就commit

 

 

svn 企业开发流程

1,       重大版本tag(备份)

2,       从tag开分支(branch)

3,       checkout  branche中的项目来修改bug

4,       修改完bug 要做四部:

1,       发布到appstore

2,       tag备份

3,       merge合并到trunk中的版本

4,       删除修复版本的branch中的项目(因为没用了)

0 0
原创粉丝点击