GIT 的常规操作

常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中

git 配置文件

  1. git的配置文件位置
    针对所有用户:/etc/gitconfig
    针对当前用户: ~/.gitconfig

  2. 查看配置的方法

    1. git config --list
  3. 修改配置的方法

    1. git config --global user.name "wangyubin" (修改的是~/.gitconfig)
    2. git config --system user.name "wangyubin" (修改的是/etc/gitconfig)

git 基本使用

  1. clone现有仓库

    1. git clone URL (URL支持gitsshhttphttps等各种协议)
  2. git中文件的各个状态

    • unstaged - git仓库中没有此文件的相关记录
    • modified - git仓库中有这个文件的记录,并且此文件当前有改动
    • staged - 追加,删除或修改的文件被暂时保存,这些追加,删除和修改并没有提交到git仓库
    • commited - 追加或修改的文件被提交到本地git仓库(git仓库中大部分都是这种文件,所以git status不显示这些文件)
  3. 查看git仓库中各文件状态

    1. git status
  4. 初始化一个仓库

    1. git init

    在当前文件夹下生成.git目录,完成初始化,此时此文件夹下的所有文件处于unstaged状态

  5. 追加文件

    1. git add test.c

    test.c的文件变为staged状态,其他文件还是unstaged状态

    5.1 追加文件的结果1 - 恢复为原先状态(变为unstaged)

    1. git rm --cache test.c

    5.2 追加文件的结果2 - 提交到git仓库(变为commited)

    1. git commit -m "my message"
  6. 修改文件

    1. echo "aaa" >> test.c

    test.c的状态变为modified

    6.1 修改文件的结果1

    1. git add test.c (暂时保存修改的内容,即变为staged

    下面有2条路可以选择:
    6.1.1 取消刚才的暂时保存

    1. git reset test.c (状态变回modified

    6.2.2 将暂存的修改提交到git仓库

    1. git commit -m "my message"

    6.2 修改文件的结果2

    1. git checkout test.c (将test.c恢复为git仓库中的最新版本,即变为commited状态,test.c的内容和5.2节一样)
  7. 删除文件
    7.1 从git仓库和磁盘上删除文件

    1. git rm test.c (当前目录中删除了test.c,在git仓库中暂时删除了test.c,相当于staged状态)

    7.1.1 从git仓库中删除test.c

    1. git commit -m "my message" (git仓库以后不再维护test.c)

    7.1.2 删错了,恢复刚才的操作

    1. git reset HEAD test.c (恢复到删除前的状态,当前目录中已删除的test.c也恢复了,test.c仍文commited状态)

    7.2 仅从git仓库中删除文件

    1. git rm --cache test.c (当前目录中没有删除了test.c,仅在git仓库中暂时删除了test.c,相当于staged状态)

    7.2.1 从git仓库中删除test.c

    1. git commit -m "my message" (git仓库以后不再维护test.c,但是当前目录中仍然有test.c)

    7.2.2 删错了,恢复刚才的操作

    1. git reset HEAD test.c (和7.1.2一样)

    7.3 误删除后的恢复
    如果删除了一个文件,并且commit之后发现删错了。也可以恢复,

    1. git log (查看各次的提交信息)
    2. git checkout commit (恢复到未删除前的commint号,此时删除的文件也恢复到磁盘上了)
    3. git checkout master (备份好删除的文件后,再回到最新状态)

git 远程仓库

  1. 查看远程仓库
    1.1 简单查看-所有仓库

    1. git remote (只能查看远程仓库的名字)

    1.2 查看更多内容-所有仓库

    1. git remote -v (远程仓库的名字及git地址)

    1.3 查看单个仓库的信息

    1. git remote show [remote-name]
  2. 新建远程仓库

    1. git remote add [shortname] [url]
    2. ex. git remote add mc git://www.host.com/gitdir/mycode.git
  3. 修改远程仓库

    1. git remote rename [oldnanme] [newname]
  4. 删除远程仓库

    1. git remote rm [remote-name]
  5. 远程仓库的数据
    5.1 获取数据

    1. git fetch [remote-name] (获取仓库的所有更新,但是不自动合并当前分支)
    2. git pull (获取仓库的所有更新, 并且自动合并到当前分支)

    5.2 上传数据

    1. git push [remote-name] [branch-name]
    2. ex. git push origin master

git 标签

  1. 列出标签
    1.1 查看所有tag

    1. git tag

    1.2 查看某个tag

    1. git show [tag-name]
  2. 新建标签
    2.1 轻量级tag

    1. git tag [tag-name]

    2.2 带标注的tag

    1. git tag -a [tag-name] -m "tag message"

    2.3 后期追加tag

    1. git log --pretty=oneline (查看所有的commit号)
    2. git tag -a [tag-name] [commit号前几位即可]
  3. 删除标签

    1. git tag -d [tag-name]
  4. 提交标签到远程仓库

    1. git push [remote-name] --tags
    2. ex. git push origin --tags

git 分支

  1. 查看和切换分支

    1. git branch (查看所有的分支及当前处于哪个分支)
    2. git branch -v (查看所有的分支的详细信息)
    3. git branch --merged (查看已经合并的分支)
    4. git branch --no-merged (查看还没合并的分支)
    5. git checkout [branch-name] (切换到某个分支)
  2. 新建分支

    1. git branch [branch-name] (新建一个分支)
    2. git branch -b [branch-name] (新建一个分支并切换到这个分支上)
  3. 合并分支

    1. git merge [branch-name]
    2. ex. 将分支btest合并到主分支master
    3. git checkout master
    4. git merge btest

    merge时有冲突的文件会列出来,需要手动合并

    将冲突手动解决后,再次用 git status来查看是否还有 unmerged的文件。
    如果没有冲突的文件,就可以 git commit 来提交这次合并了。

  4. 删除分支

    1. git branch -d [branch-name]
    2. 或者 git branch -D [branch-name] (强制删除某个还未合并的分支)
  5. 远程分支相关
    5.1 新建远程分支

    1. git checkout [local_branch] (首先进入想要上传的分支)
    2. git remote add [remote_repo] [remote_branch]
      (这里的[remote_branch]是远程分支的名字,一般和[local_branch]同名,
      [remote_repo]是远程仓库的名字)

    3. 2 向远程分支推送数据

      git push [remote_repo] [remote_branch]

    4. 3 删除远程分支

      git push [remote_repo] :[remote_branch] (注意远程分支前有个":")

  6. 合并分支的另一个方法:衍和

衍和可以简化master上的提交记录,使得代码可以方便的回退,
但是在公共仓库上用衍和有一定的风险。
衍和我基本用不上,这里就不赘述了。

服务器创建 git 仓库, 并将其作为远程仓库

其实 git 是分布式的 SCM. 并不存在谁是服务器, 谁是客户端的问题, 这里所说的服务器上的git仓库, 指的是多人合作开发时, 共用的, 作为最终发布版本的 git 仓库.
这个 git 仓库就相当于你在 github 上建的仓库, 会将你在各个电脑上做的代码等提交到上面进行统一管理.

  1. 服务端 (远程 git 仓库)

    • 生成用于git服务的账户 (一般就用git)

      1. groupadd gpxxx
      2. useradd -m -g gpxxx gitxxx
    • 初始化服务端的git 仓库

      1. cd ~/
      2. mkdir git-repo
      3. cd git-repo
      4. mkdir test.git
      5. cd test.git
      6. git --bare init
  2. 客户端 (本地 git 仓库)

    • 新建本地git 仓库

      1. cd ~/gitlocal
      2. mkdir test
      3. cd test
      4. git init
    • 初始化本地仓库

      1. touch README
      2. git add README
      3. git commit -m 'first commit for init'
    • 设置git用户信息

      1. git config --global user.name "wangyubin"
      2. git config --global user.email "xxx@xxx.com"
    • 关联远程仓库

      1. git remote add origin gituser@<server address>:~/test.git/
    • 将本地仓库提交到远程

      1. git push origin master

git 使用中遇到的一些问题

git pull 时, 远程文件与本地文件有冲突

如果远程的仓库被其他人更新了, 并且更新的内容与我自己本地编辑的内容有冲突. 这时执行 git pull 可能有如下message:

  1. Auto-merging path/to/conflict-file
  2. CONFLICT (content): Merge conflict in path/to/conflict-file
  3. Automatic merge failed; fix conflicts and then commit the result.

用文本编辑器 vim 或者 emacs 之类的来编辑冲突的文件 path/to/conflict-file, 冲突的地方有类似如下的显示

  1. <<<<<<< HEAD
  2. App_Log.logger.debug(u'开始时间: ' + utils.datetime2str(datetime.datetime.now()))
  3. file = request.FILES.get('file-xxx')
  4. App_Log.logger.debug(u'结束时间: ' + utils.datetime2str(datetime.datetime.now()))
  5. =======
  6. file = request.FILES.get('xxxx')
  7. >>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5

===== 之上的 <<<<<<< HEAD 是本地的内容
===== 之下的 >>>>>>> 3602514cc2bf1b3a64470b31ad79e07fe372add5 是远程的内容(这个commit号每次都会不同)
根据实际情况, 删除多余的内容(包括===== >>>>> <<<<<< 之类的), 修改冲突的地方, 如果以本地的代码为准的话, 会得到如下结果:

  1. App_Log.logger.debug(u'开始时间: ' + utils.datetime2str(datetime.datetime.now()))
  2. file = request.FILES.get('file-xxx')
  3. App_Log.logger.debug(u'结束时间: ' + utils.datetime2str(datetime.datetime.now()))

然后 git commit -am '提交的信息' 就解决了冲突.
最后, 也可以将本地的修改同步到远程 git 仓库: git push

git pull 时, 本地还有未commit 的文件

从远程仓库更新时, 假使本地还有没commit的文件A, 远程仓库的A文件却被修改了. 此时进行 git pull 时有如下信息:

  1. 6a707cc..f93575d master -> origin/master
  2. Updating 6a707cc..f93575d
  3. error: Your local changes to the following files would be overwritten by merge:
  4. apps/myapp/utils.py
  5. Please, commit your changes or stash them before you can merge.
  6. Aborting

此时, 如果不想将本地文件commit(可能只是临时的修改), 但是又像将远程的仓库更新下来, 可以这样:

  1. $ git stash # 先将自己的改变保存起来
  2. Saved working directory and index state WIP on master: 6a707cc ...
  3. HEAD is now at 6a707cc ...
  4. $ git pull # 从远程仓库更新
  5. Updating 6a707cc..f93575d
  6. ... ...
  7. $ git stash pop # 将自己的修改合并到更新后的代码中

最后一步如果有冲突, 再参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.

git 分支合并时的冲突

正在开发的分支和主分支的编辑了同一个文件时, 在主分支上进行 merge 的时候可能会产生冲突.
以下构造一个冲突的示例:

  1. $ git branch test # 创建一个分支 test, 但是没有进入test分支, 此时还在 master 分支上.
  2. $ vim xxxx # 编辑 master 分支上的一个已有的文件
  3. $ git commit -am 'xxx message' # 提交 master 分支的修改
  4. $ git checkout test # 切换到 test 分支
  5. $ vim xxxx # 编辑之前在 master 上编辑的文件, 可以编辑同一个地方, 造成冲突
  6. $ git commit -am 'xxx message' # 提交 test 分支的修改
  7. $ git checkout master # 切换到 master 分支
  8. $ git merge test # 将 test 分支合并到 master 分支, 由于上面编辑了同一文件, 这里会产生冲突
  9. Auto-merging xxxx
  10. CONFLICT (content): Merge conflict in xxxx
  11. Automatic merge failed; fix conflicts and then commit the result.

最后, 参照上一节中解决冲突的步骤, 用文本编辑器修改冲突文件.

通过 git 提取补丁

提取的补丁的方法有多种:

  1. $ git format-patch -1 # 提取本次 commit 和上次 commit 之间的不同, 并生成patch文件
  2. $ git format-patch -2 # 提取本次 commit 和 上上次 commit 之间的不同, 并生成patch文件
  3. $ git format-patch commit1 commit2 # 提取2次commit号之间的不同, 并生成patch文件 (commit号可以通过 git log 来查看)
  4. $ git format-patch tag1 tag2 # 提取2次tag之间的不同, 并生成patch文件 (tag可以通过 git tag 来查看)

通过 git 提取指定版本的源码

这个功能在部署的时候比较有用.

  1. $ git archive --format=tar --prefix="tagxx/" tagxx > ../tagxx.tar # 获取 tagxx 的源码, 加了 --prefix 的作用是在最终的 tagxx.tar 中加了一层文件夹 tagxx

上面的 tagxx 也可以是 commit号

GIT的使用中的问题处理的更多相关文章

  1. Git bash使用中...

    理解Head指向分支及标签tag Head指向当前分支(如master),可以把每次提交完成的修改看成一个圈,在修改上可以开另一分支为接下来的修改做准备,未修改前新建的分支与当前分支可看成绕修改圈转: ...

  2. git在使用中出现 refusing to merge unrelated histories如何解决?

    一.GIT的使用 # 设置用户名 git config --global user.name "zhaijihai" # 设置用户邮箱 git config --global us ...

  3. git 完善使用中

    GIT 版本库控制: 第一步:Git 的账号注册 url :https://github.com/ 这是git的官网如果第一次打开会这样 中间红色圈内是注册 内容, 第一项是用户名 第二项是邮箱 第三 ...

  4. git bash【初级入门篇】

    最近公司打算使用git代替之前的svn版本控制工具,趁此机会打算好好学学git,这个号称当今世界最牛的分布式版本控制工具. 一.[git和svn的主要区别] 1.去中心化 svn以及微软的TFS均采用 ...

  5. Git 基本原理与经常使用命令

    平时使用过两种版本号控制软件 SVN 和 Git,平心而论,假设纯粹自己使用,那么绝对 Git 更加适合,本地库.远程库.离线工作.强大而灵活的分支.大名鼎鼎的Github, 这些都是选择 Git 的 ...

  6. 学Git,用Git ①

    本月开始接触到Git版本管理工具,觉得很有意思,在这里总结一下学习Git的一些心得体会. 要在Mac上完整的使用git进行版本管理,需要熟悉Mac终端操作命令和Git操作命令两种命令,索性两种命令加在 ...

  7. eclipse git 开发操作流程

    1.eclipse git 开发操作流程 1.1流程简介 1)master主分支,当开发版本得到了充分的验证之后,才能将分支合入master,master为可产品化发布的状态. 2)develop分支 ...

  8. 【Git】Git使用小结

    Git与SVN及TFS这类传统的版本管理的区别: 本地机器也会有分支.代码库的概念 SVN常用的做法是每次写一些代码就提交到仓库,但是Git是先提交到本地(commit),然后当本地有个稳定的版本的时 ...

  9. git的回退和撤销操作

    回退是git的使用中很常用的一个操作,如果清楚各个回退命令的作用,不仅大大加快代码回退的效率,还能避免代码回退造成的事故 1.git reset --hard [commit] 清空暂存和未暂存的更改 ...

随机推荐

  1. SPOJ SERGRID - Grid BFS

    SERGRID - Grid no tags  You are on an nxm grid where each square on the grid has a digit on it. From ...

  2. MYSQL瓶颈

    一般来说, 在使用的时候 性能从某个数值开始.突然大大下降,说明就到了瓶颈期. mysql 瓶颈有2种,一种是 cpu瓶颈  一种是 io瓶颈.cpu瓶颈多是由io引起. 而io可以通过  show ...

  3. 欢迎大家关注我的微信公众号(nangongkuo)

    欢迎大家关注我的微信公众号,在这个公众号里面我会给大家分享我学习过程中分享给大家的一些技术性的东西,和一些生活经验的总结分享.

  4. Web前端学习——HTML

    HTML其实还是蛮容易学习的,无非就是一些标签.格式的填写,大学的时候也做过网站设计,所以这里主要记录一些常用的HTML标签.属性以及书写方法等. 一.常见HTML格式 主要包含文件type,html ...

  5. 利用模板template动态渲染jsp页面

    一.场景 在js中写html简直是噩梦,刚进新公司,在codereview的时候得知可以通过将html模板写在jsp页面,然后由js调取模板,利用replace()方法替换传值的方式避免在js中拼接h ...

  6. Android 四大组件学习之ContentProvider四

    上节我们学习了怎样去读取系统短信以及插入一条短信到系统中. 本节我们学习怎样获取系统的联系人,以及插入一条联系人 好.废话不多说了,直接操作. 首先和读取短信一样,先找到联系人在数据库中的位置. wa ...

  7. python文件和文件夹訪问File and Directory Access

    http://blog.csdn.net/pipisorry/article/details/47907589 os.path - Common pathname manipulations 都是和路 ...

  8. (转)java内部类详解

    本文转自http://www.cnblogs.com/dolphin0520/p/3811445.html,谢谢作者 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能 ...

  9. 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作

    无监控,不运维.好了,废话不多说,下面都是干货. 警告:流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html ...

  10. mysql与服务器之间的编码问题

    1.之前在练习一个java web的项目时,mysql的编码设置正确,服务器的编码也设置正确,但向mysql中存储数据时,就会出现乱码问题,后来发现是mysql与服务器之间的编码设置问题,以下是mys ...