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/dev的log记录,如果要更新服务器的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不会保存合并信息
2)git 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/master里commit,但可以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版本”
创建轻量标签不需要传递参数,直接指定标签名称即可。
创建附注标签时,参数a即annotated的缩写,指定标签类型,后附标签名。参数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可以加多个
假如要合并本地两个分支(A,B),
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分支的工作区上又修改,然后切换过来修改会保留,然后我没注意,然后接着在dev上touchz.txt git add . git commit –m “add z.txt” 结果惊奇发现我把之前master带过来的修改都commit到dev分支了。。。。。
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中的项目(因为没用了)
- 【Git】Git常用命令总结
- Git:Git常用命令总结
- 【Git】Git常用命令总结
- git:总结git常用命令
- git 总结
- git 总结
- Git总结
- Git 总结
- git 总结
- git总结
- GIT总结
- git 总结
- git 总结
- GIT总结
- git总结
- Git总结
- git总结
- Git总结
- 关于小型管理系统的数据库连接及其运行
- 关于 android app 返回键模拟 home键 功能的介绍_仿QQ返回键 又重新回到当前界面_锁屏状态 又要重新唤醒
- File常用方法
- 异常: 2 字节的 UTF-8 序列的字节 2 无效。
- Oracle之SQL基础--约束
- git总结
- [Interview Summary] HTML+CSS Part I
- shell 脚本 M-BM- 字符问题
- 那些我们解过的bug之蓝牙耳机不能播放上一首歌
- 关于contain_of的理解
- Linux c学习--从标准输入输出看流和缓冲区
- tomcat配置数据源
- CentOS安装配置redis
- 甲骨文为树莓派版(ARM)Java提供支持