之前的多人项目大多使用了SVN作为版本控制,自己只会用eclipse连接GitHub的操作。这次项目采用了git作为版本控制系统,所以学会了很多新操作,这里权当记录,以备后用。

  git的一些基本操作可参考http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

  简而言之就是:

  git fetch

  git merge

  git merge [分支]

  git push

  git branch [新分支]

  git checkout [file]  不保留此文件的修改,退回上次commit

  git checkout .  不保留所有文件的修改,退回上次commit

  git checkout [branch]  切换分支

  git branch -d [分支]  删除分支

  git remote -v 查看remote

  git log   查看版本

  git log --stat  查看版本详细信息

  git reset [版本号,通过log获取] 退回版本到版本

  git rebase [branch] 取消自己所做的更改并记录,将目标分支pull过来,然后在此基础上重复自己的更改记录,和git merge最大区别是指针指向。详情参考http://blog.csdn.net/hudashi/article/details/7664631/

          在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:

  git rebase --continue   这样git会继续应用(apply)余下的补丁。在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。
  git rebase --abort

  这里写出若干个常用场景:

  0、忽略乱七八糟的文件

  用git的时候总有些什么classpath等文件被不小心传上remote(尤其是elipse直接share的时候),别人下载下来也是带着classpath文件的,但是每个人的classpath其实是不一样的,所以每次提交的时候会发现有classpath文件已更新,这东西还不能删了,删了之后别人再用eclipse pull的话会导致工程出现问题。所以干脆自己忽略好了:

  a) gitignore文件:这个解决方法在文件没被追踪的时候加入到此文件,则可以忽略此文件,但是已经追踪的再加入就无效了。

  b) git rm--cache 文件:这个命令可以在不删除本地文件的条件下删除追踪,但是对于classpath这种删完别人会出错的东西不适用,因为其他人pull的时候会把他本地的classpath删了。。。

  c) git update-index --assume-unchanged docMining/.classpath:这种方法相当于在本地忽略了classpath更新,提交和更新时都会忽略这个文件,不想麻烦的每个人都重建一遍工程的话可以在发生冲突的机器执行这个命令。如果想取消忽略使用如下命令:git update-index --no-assume-unchanged docMining/.classpath

  1、git解决冲突

  使用git mergetool 命令可以打开冲突文件,修改后git commit即可保存为一个合并后的文件。合并后出现的,orig文件删除即可。

  2、git subtree

  在这里我有一个工作场景如下:

  我的一部分个人代码托管在了github上,现在这部分代码要作为一个多人工程的一个依赖工程,个人工程内的许多类和方法多人工程要用到。我又不想这两个版本分别维护,毕竟分别维护的成本很高,但是又要保证两边代码一致并且和两个remote一致,一个是自己搭建的git另一个是github。

  这种情况svn比较难以解决,但是git还算方便,可以使用git subtree命令来实现。

  首先说一下git subtree的工作过程,我们通过创建一个subtree将个人工程当成一个子工程拷贝到我们多人工程的工作空间内  

git subtree add --prefix=子项目相对于多人项目的相对路径 子项目的地址(可以指定本机的.git文件夹,或者远程的.git,如github) 多人工程的某分支

如git subtree add --prefix=segmentation/ ../../eclipse/workspace/segmentation/segmentation/.git master

需要注意的是--prefix一定要指定相对路径,在windows下以/开头或者以D:开头会直接报错,路径不能创建

  也就是说我们还是相当于有两份这个工程,也需要保证两个工程的一致性,但是不必手动管理,可以使用git维护两个工程:

git subtree pull --prefix=子项目相对于多人项目的相对路径 子项目的地址(可以指定本机的.git文件夹,或者远程的.git,如github) 多人工程的某分支

如git subtree pull --prefix=segmentation/ ../../eclipse/workspace/segmentation/segmentation/.git master

 这样我在个人代码中进行的修改就可以同步到多人工程的master项目下了,当然,是从远端的master同步到本地的master下。

git subtree pull --prefix=子项目相对于多人项目的相对路径 子项目的地址(可以指定本机的.git文件夹,或者远程的.git,如github) 个人工程的某分支

git subtree push --prefix=segmentation/ ../../eclipse/workspace/segmentation/segmentation/.git hotfix

需要注意的是,最好Push到一个不存在的分支,不然有可能会有奇怪的问题,个人工程会进行恢复操作,还得使用git checkout .来保证更新,而push到一个不存在的分支则直接可以git merge hotfix就行

  这样就可以在两个工程之间进行相互同步了。

 杂谈:

  在搜索git子模块的过程中git submodule和repo被反复提及,https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldn't-use-git-submodules/

  上述文章阐明了为什么不考虑使用submodule,并且建议在提到的另外几种子模块中挑选一种进行使用,然而在git-scm上的book中,第一版介绍了submodule和subtree,第二版只介绍了submodule,所以究竟哪个更好显得不是那么明确。目前我本人的需求来讲git subtree能实现的非常完善,但是以后需求变化了可能会尝试使用其他命令。

git常用操作记录的更多相关文章

  1. [skill][git] git 常用操作记录

    傻瓜入门: step by step : https://try.github.io/levels/1/challenges/1 一本书: https://git-scm.com/book/en/v2 ...

  2. git报错:'fatal:remote origin already exists'怎么处理?附上git常用操作以及说明。

    git添加远程库的时候有可能出现如下的错误, 怎么解决? 只要两步: 1.先删除 $ git remote rm origin 2.再次执行添加就可以了. ---------------------- ...

  3. 版本控制工具——Git常用操作(上)

    本文由云+社区发表 作者:工程师小熊 摘要:用了很久的Git和svn,由于总是眼高手低,没能静下心来写这些程序员日常开发最常用的知识点.现在准备开一个专题,专门来总结一下版本控制工具,让我们从git开 ...

  4. Hbase常用操作记录

    Hbase常用操作记录 Hbase 创建表 查看表结构 修改表结构 删除表 创建表 语法:create <table>, {NAME => <family>, VERSI ...

  5. git常用操作 配置用户信息、拉取项目、提交代码、分支操作、版本回退...

    git常用操作 配置用户信息.拉取项目.提交代码.分支操作.版本回退... /********git 配置用户信息************/ git config --global user.name ...

  6. Git常用操作(二)

    仓库拉取 git clone XXX 修改仓库链接 $ git config -l # 显示coding列表 $ git config --get remote.origin.url # 返回orig ...

  7. git -- 项目开发最常用操作记录

    官方Git - Book https://git-scm.com/book/zh/v2 ------------------------------git配置以及公钥生成--------------- ...

  8. 版本控制工具——Git常用操作(下)

    本文由云+社区发表 作者:工程师小熊 摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码.使用分支.出现代码冲突的解决办法.紧急保存现场和恢复现场的操作.学会以后已经 ...

  9. 『GitHub』Git常用命令记录

    Commands: git init 把当前目录变成Git可以管理的仓库 随后出现.git目录,这个目录是Git来跟踪管理版本库的git commit -m "change message& ...

随机推荐

  1. Idea2018旗舰版破解方法

    完整请参考 https://www.jianshu.com/p/3c87487e7121 1.在hosts文件里添加一行: 0.0.0.0 account.jetbrains.com 2.在Activ ...

  2. 让织梦内容页arclist标签的当前文章标题加亮显示

    很多人在用织梦做站的时候,会用到在当前栏目页面,给当前栏目标题使用指定样式如标题加亮,或者放个背景图.这是一个很常用和实用的功能,比如在导航页面,标识当前在浏览哪个栏目.如下图: 但是有些时候,我们在 ...

  3. Shell常见问题整理

    1. 使用shell进行程序设计的原因是什么? 可以快速.简单的完成编程,非常适合于编写一些执行相对简单的任务的小工具.如果有一个简单的构想,可以通过它检查自己的想法是否可行.还可以使用shell对进 ...

  4. iOS开发之--UIImageView的animationImages动画

    图片动画实现,代码如下: -(UIImageView *)animationImageView { if (!_animationImageView) { _animationImageView= [ ...

  5. puppet(3) 变量、数据类型、表达式、条件判断语句-if、case、selector、unless

    puppet(4) 变量.数据类型.表达式.条件判断语句-if.case.selector语句 puppet变量: 1.名称必须以$开头:赋值使用=,支持追加赋值+=: 2.每个变量都有两种引用格式: ...

  6. HTML自动跳转

    本文首发于 http://youngzy.com/ 关于页面的自动跳转,以前知道有JavaScript的方法,直接设置window.location 或者在setTimeout 函数里进行设置. 现在 ...

  7. CSS属性选择器和部分伪类

    p[name]{background:red;} 只使用属性名p[name=ghr]{background:red;} 指定属性名,并指定了该属性的属性值p[name~=old]{background ...

  8. C++学习 —— 重新认识C++

    我大概是从读研究生入学那天开始,想要学好C++的,学习C++几乎也成了我每个学期的计划之一.为什么会每个学期都想要学好C++呢?因为每次学习都失败了啊... 本月,我开始再Coursera上学习Het ...

  9. mysql limit 性能问题分析

    问题重现 // todo 参考文章: MySQL 单表分页 Limit 性能优化 Scalable MySQL: Avoid offset for large tables 证明为什么用limit时, ...

  10. kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下

    kernel中,dump_stack打印调用栈,print_hex_dump打印一片内存,记录一下