设为首页 收藏本站
查看: 811|回复: 0

[经验分享] 强大的版本管理工具 Git

[复制链接]
发表于 2018-1-13 13:00:56 | 显示全部楼层 |阅读模式
Git 简介

git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。是 linux 创始人 Linus Torvalds 为了帮助管理 linux 内核开发而开发的一个开放源码的版本控制软件。最初 git 的开发是为了辅助 linux 内核开发的过程,因为 git 免费而又超级好用,现在已经成为最流行的分布式版本控制系统,尤其是 2008 年, github 网站上线了,它为开源项目免费提供 git 存储,无数开源项目开始迁移至 github 。
Git 安装
  提供了各种平台的安装方法,跟着说明安装即可。

  以 windows 系统为例,安装完后打开 git bash 命令行工具,输入 git --version 查看安装的 git 版本
  

alsy@home-alsy MINGW64 /  
$ git
--version  
git version
2.11.0.windows.3  

  打印出版本信息说明你已经成功安装 git 了

Git 的相关设置

1. 自报家门,设置你的姓名和 email
  

$ git config --global user.name "your_name"  
$ git config
--global user.email "your_email"  

  注意: git config 命令的 --global 参数,这时你这台电脑上所有的 git 仓库都会使用这个配置,当然你也可以针对某个仓库指定不同的用户名和 email 地址。

2. 设置 git 输出显示颜色,看起来更醒目
  

$ git config --global color.ui true  


3. 关于 git config
  查看仓库级的config,命令:git config --local -l
  查看全局级的config,命令:git config --global -l
  查看系统级的config,命令:git config --system -l
  注意配置文件的优先级是: 仓库 > 全局 > 系统
  查看当前生效的配置,命令:git config -l,这个时候会显示最终三个配置文件计算后的配置信息
  

$ git config --local -l  
$ git config
--system -l  
$ git config
--global -l  
$ git config
-l  


Git 工作流
  你的本地仓库由 git 维护的三棵“树”组成。
  第一个是你的工作区, 它持有实际文件,就是你在文件资源管理器中看到的。
  第二个是暂存区(stage),它像个缓存区域,临时保存你的改动。
  最后是HEAD,它指向你最后一次提交的结果。


Git 相关操作

1. 创建新仓库
  在一个空的工作目录中开始,创建一个名为 learngit 的空目录, 然后创建一个名为 a.txt 的文件。
  

$ mkdir learngit  

$ cd learngit  

$ touch a.txt  

$ ls  
a.txt
  

  你现在有一个包含单个文件的目录,执行 git init 命令,从该目录创建 git 仓库。git 会自动创建的一个分支叫 master。
  

$ git init  
Initialized empty Git repository
in G:/learngit/.git/  


2. 检查仓库的状态
  使用 git status 命令检查当前仓库的状态,这是个比较常用的命令。
  

$ git status  
On branch master
  
Initial commit
  
Untracked files:
  (use
"git add <file>..." to include in what will be committed)  
    a.txt
  
nothing added to commit but untracked files present (use
"git add" to track)  


3. 将更改提到暂存区
  使用 git add <file> 命令将文件更改提交到暂存区,当有多个文件时使用 git add . 命令提交所有文件的修改包括新建的文件。
  

$ git add a.txt  $ git add .
  

  使用 git status 查看仓库的状态
  

$ git status  
On branch master
  
Initial commit
  
Changes to be committed:
  (use
"git rm --cached <file>..." to unstage)  
    new
file:   a.txt  


4. 把暂存区的内容提交到当前分支(默认为 master)
  这里会有一个 HEAD 指针指向 master 分支,并且 HEAD 指针总是指向你的当前分支。
  

$ git commit  
[master (root
-commit) 91c0959] first commit1 file changed, 0 insertions(+), 0 deletions(-)  create mode
100644 a.txt  

  执行 git commit 命令,会调出文本编辑器,提示你输入一段本次提交的描述。
  你也可以使用 git commit -m 'first commit' 来快速的进行描述提交,如果发现提交的描述有误或者不恰当可以使用 git commit --amend 命令来对最近提交的描述信息进行替换
  使用 git status 查看仓库的状态
  

$ git status  
On branch master
  
nothing to commit, working tree clean
  


5. 查看历史提交记录
  使用 git log 命令查看
  

$ git log  
commit 91c0959fab89f5a612db84f047bf13afb1162a26
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 14:10:44 2017 +0800  

  first commit
  

  这时列出了我们第一次提交的记录
  下面我们来更改 a.txt 的内容, 再次提交来查看记录

  

$ echo 'some modified' > a.txt //向a.txt写入'some modified'  

  
$ git status //查看仓库的状态
  
On branch master
  
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  

  modified:   a.txt
  

  
no changes added to commit (use "git add" and/or "git commit -a")
  

  
$ git commit -a -m 'second commit' //这是暂存和提交一起操作的缩写,后面跟描述
  
[master e9df1e3] second commit
  1 file changed, 2 insertions(+)
  

  
$ git log //查看记录
  

  
commit e9df1e351fc321d4c63bfe9f76773759a03012e2
  
Author: alsy <2944927590@qq.com>
  
Date: Sat Mar 25 14:50:36 2017 +0800
  

  
second commit
  

  
commit 91c0959fab89f5a612db84f047bf13afb1162a26
  
Author: alsy <2944927590@qq.com>
  
Date: Sat Mar 25 14:10:44 2017 +0800
  

  
first commit
  


View Code  我们可以看到我们这两次提交的记录

6. 撤销修改
  文件的撤销修改可以分为三个时间点的撤销

a. 修改了文件,没有 add 到暂存区

  

$ echo 'some modified ~' >> a.txt //往 a.txt 追加 'some modified ~'  

  
$ cat a.txt //输出 a.txt 的内容
  
some modified
  
some modified ~
  

  
$ git status
  
On branch master
  
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  

  modified:   a.txt
  

  
no changes added to commit (use "git add" and/or "git commit -a")
  


View Code  可以看到我们修改了 a.txt 文件,此时查看状态,git 会提示你是要 git add <file> 去提交更改还是 git checkout -- <file> 去丢弃更改,当然这里我们是要丢弃更改

  

$ git checkout -- a.txt  

  
$ git status
  
On branch master
  
nothing to commit, working tree clean
  

  
$
cat a.txt  
some modified
  


View Code  此时 a.txt 有恢复到原来的状态

b. add 到暂存区,没有 commit 到分支

  

$ echo 'some modified ~' >> a.txt  

  
$ git add a.txt
  

  
$ git status
  
On branch master
  
Changes to be committed:
  (use
"git reset HEAD <file>..." to unstage)  modified:   a.txt
  


View Code  可以看到我们修改了 a.txt 文件并且把它提交到暂存区,此时查看状态,git 会提示你 git reset HEAD <file> 把暂存区的修改撤销掉(unstage),重新放回工作区

  

$ git reset HEAD a.txt  
Unstaged changes after reset:
  
M       a.txt
  

  
$ git status
  
On branch master
  
Changes not staged
for commit:  (use
"git add <file>..." to update what will be committed)  (use
"git checkout -- <file>..." to discard changes in working directory)  

  modified:   a.txt
  

  
no changes added to commit (use
"git add" and/or "git commit -a")  


View Code  执行 git reset HEAD a.txt 命令后,我们查看状态,可以看到暂存区是干净的,工作区的 a.txt 有修改,和第 1 种情况一样

c. commit 到分支

  

$ echo 'some modified ~' >> a.txt  

  
$ git commit
-a -m 'add some modified'  
[master 533f16a] add some modified
1 file changed, 1 insertion(+)  

  
$ git st
  
On branch master
  
nothing to commit, working tree clean
  

  
$ git log
  
commit 533f16a192ff11cbc5fa92643780155e50dcab60
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 15:48:52 2017 +0800  

  add some modified
  

  
commit 71b53372b30d69648a4c2516d73fa3563197ec08
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 14:50:36 2017 +0800  

  second commits
  

  
commit 91c0959fab89f5a612db84f047bf13afb1162a26
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 14:10:44 2017 +0800  

  first commit
  


View Code  可以看到我们已经把修改 commit 到分支了,这时我们可以采用两种方式来撤销
  (1) git revert [ HEAD | commit-ish ]

  

$ git revert HEAD  
[master e1f8ce3] Revert
"add some modified"  1 file changed, 1 deletion(-)
  

  
$ git log
  
commit e1f8ce3351bd1bf0e2532c8f1e227c995bbc48e0
  
Author: alsy <2944927590@qq.com>
  
Date:   Sat Mar 25 15:59:21 2017 +0800
  

  Revert "add some modified"
  

  This reverts commit 533f16a192ff11cbc5fa92643780155e50dcab60.
  

  
commit 533f16a192ff11cbc5fa92643780155e50dcab60
  
Author: alsy <2944927590@qq.com>
  
Date:   Sat Mar 25 15:48:52 2017 +0800
  

  add some modified
  

  
commit 71b53372b30d69648a4c2516d73fa3563197ec08
  
Author: alsy <2944927590@qq.com>
  
Date:   Sat Mar 25 14:50:36 2017 +0800
  

  second commits
  

  
commit 91c0959fab89f5a612db84f047bf13afb1162a26
  
Author: alsy <2944927590@qq.com>
  
Date:   Sat Mar 25 14:10:44 2017 +0800
  

  first commit
  


View Code  可以看到 git revert 是生成一个新的提交来撤销某次提交,此次提交之前的 commit 都会被保留
  (2) git reset [ --soft | --mixed | --hard ]  [ HEAD^ | commit-sh ]


  • --soft
  保留源码,只回退到 commit 信息到某个版本,不回退暂存,如果还需要提交,直接commit即可。


  • --mixed
  保留源码,回退 commit 和暂存信息到某个版本。
  git reset 默认是 --mixed 模式
  git reset --mixed  等价于  git reset


  • --hard
  源码也会回退到某个版本,commit 和 index 都会回退到某个版本。

  

$ echo 'some modified ~' >> a.txt  

  
$ git commit
-a -m 'git reset test'  

  
$ git log
  
commit 7c7c69f2b891b4368fd4d59c31827793e41ceac5
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 16:31:08 2017 +0800  

  git reset test
  

  
commit e1f8ce3351bd1bf0e2532c8f1e227c995bbc48e0
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 15:59:21 2017 +0800  

  Revert
"add some modified"  

  This reverts commit 533f16a192ff11cbc5fa92643780155e50dcab60.
  

  
commit 533f16a192ff11cbc5fa92643780155e50dcab60
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 15:48:52 2017 +0800  

  add some modified
  

  
commit 71b53372b30d69648a4c2516d73fa3563197ec08
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 14:50:36 2017 +0800  

  second commits
  

  
commit 91c0959fab89f5a612db84f047bf13afb1162a26
  
Author: alsy
<2944927590@qq.com>  
Date:   Sat Mar
25 14:10:44 2017 +0800  

  
$ git reset
--hard HEAD^  
HEAD is now at e1f8ce3 Revert
"add some modified"  

  
$
cat a.txt  
some modified
  


View Code  git revert 是用一次新的 commit 来回滚之前的 commit,git reset 是直接删除指定的 commit。

7. 分支的管理

a. 创建分支
  使用 git branch <branch_name> 来创建一条新的分支
  

$ git branch dev  

  
$ git branch
  dev
  

* master  

  我们在 master 基础上创建了一条 dev 分支,git branch 命令可以帮助我们查看所有的本地分支,并且在当前分支前带有 * 号标记

b. 切换分支
  使用 git checkout <branch_name> 来切换分支
  

$ git checkout dev  
Switched to branch
'dev'  

  
$ git branch
  

* dev  master
  

  看到我们已经处于 dev 分支上了

c. 合并分支
  现在我们在 dev 分支上做一些修改
  

$ echo 'some modified on dev' >> a.txt  

  
$ git commit
-a -m 'some modified on dev'  

  我们要将 dev 分支上的代码合并到master,使用 git merge <branch_name> 来合并分支

  

$ git checkout master  
Switched to branch
'master'  

  
$ git merge dev
  
Updating e1f8ce3..0209ed1
  
Fast
-forward  a.txt
| 1 +  1 file changed, 1 insertion(+)
  

  
$ cat a.txt
  
some modified
  

  
some modified on dev
  


View Code  可以看到此时 dev 上的修改已经到 master 上了

8. 远程仓库
  远程仓库其实和本地仓库一样,只不过是作为一个代码提交、共享的平台,一般也不会有人直接在上面做提交修改。github 是免费 git 仓库的托管平台,我们可以在 github 创建一个仓库作为我们的远程仓库。当然我们也可以自己搭建 git服务器,来创建我们的远程仓库。以 github 为例:

a. 创建ssh key :
  

$ cd ~/.ssh/  
$
ls  
github_rsa  github_rsa.pub >  

  看看这个目录下有没有>  

$ ssh-keygen -t rsa -C "youremail"  

  id_rsa 是私钥, id_rsa.pub 是公钥,我们需要把公钥添加到 github , 把 id_rsa.pub 里面的内容添加到 github 上:

  这样我们才有权限去推送代码

b. 创建远程仓库


c. 本地关联远程仓库
  我们可以根据 github 上给出的提示来与远程仓库进行关联,即:


  

$ git remote add origin https://github.com/2944927590/node-practice.git  

  
$ git push origin master
  
Counting objects: 13, done.
  
Delta compression using up to 4 threads.
  
Compressing objects: 100% (5/5), done.
  
Writing objects: 100% (13/13), 1.03 KiB | 0 bytes/s, done.
  
Total 13 (delta 0), reused 0 (delta 0)
  
To https://github.com/2944927590/node-practice.git
  * [new branch]      master -> master
  


View Code  我们可以使用 git push --set-upstream origin master 让本地的 master 分支与远程仓库的 master 分支建立连接,这样我们可以直接使用 git push 来将本地 master 分支代码推送到远程 master 分支


  

$ git push --set-upstream origin master  
Branch master set up to track remote branch master from origin.
  
Everything up
-to-date  

  
$ git push
  
Everything up
-to-date  


View Code
d. 拉取最新代码
  git pull 命令来拉取远程仓库的最新代码到本地,这里需要指出 git pull 相当于 git fetch(取下更改) 和 git merge (合并到本地分支)两条命令

  

$ git pull  
Already up
-to-date.  


View Code
9. Git 设置别名
  

$ git config --global alias.co checkout  
$ git config
--global alias.ci commit  
$ git config
--global alias.br branch  
$ git config
--global alias.st status  
$ git config
--global alias.lg log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit  

  这样 git checkout 等命令可以用 git co 等代替了,当然你可以对其他命令设置别名。

10. 实际开发中的分支
  一般我们在项目开发中,会有一个 master 分支作为整个项目的主分支,也就是实际上线的代码分支;同时可能还会有一个 dev 分支,作为开发环境的代码分支;有的还会有一个 qa 分支,作为测试环境的代码分支;我们都是在为这三条分支服务。比如我们接到新的需求,开始创建分支,首先切到 master 分支,git pull 拉取最新的代码,创建一个自己的开发分支 task , 我们在 task 分支上开始写我们的代码,merge 到 dev 分支进行开发调试,merge 到 qa 分支进行测试,最后 merge 到 master 分支上线。

拓展阅读


  • 沉浸式学 Git
  • Git 教程(廖雪峰)
  • Git - 简易指南
  • git reset revert (一介布衣)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-434638-1-1.html 上篇帖子: [Git]checkout 指定版本 下篇帖子: git分支切换与git rebase , git stash
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表