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

[经验分享] Git 学习一

[复制链接]

尚未签到

发表于 2018-9-18 06:56:08 | 显示全部楼层 |阅读模式
声明:原文出处 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
  
一:集中式和分布式版本控制系统
  集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作。
  分布式版本控制系统:安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
  二:安装完成
  安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"  
$ git config --global user.email "email@example.com"
  因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
  注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
  三:创建版本库(repository
  创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir learngit  
$ cd learngit
  
$ pwd
  
/Users/michael/learngit
  通过git init命令把这个目录变成Git可以管理的仓库:
$ git init  
Initialized empty Git repository in /Users/michael/learngit/.git/
  瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件。
  
  四:添加文件到版本库
  所有的版本控制系统,其实只能跟踪文本文件的改动,二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB。
  我们编写一个readme.txt文件,内容如下:
Git is a version control system.  
Git is free software.
  一定要放到learngit目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。
  第一步,用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt  执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
  第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"  
[master (root-commit) cb926e7] wrote a readme file
  
1 file changed, 2 insertions(+)
  
create mode 100644 readme.txt
  为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt  
$ git add file2.txt
  
$ git add file3.txt
  
$ git commit -m "add 3 files."
  五:修改文件并提交
  我们已经成功地添加并提交了一个readme.txt文件,现在,我们继续修改readme.txt文件,改成如下内容:
Git is a distributed version control system.  
Git is free software.
  现在,运行git status命令看看结果:
$ git status  
# On branch master
  
# Changes not staged for commit:
  
#   (use "git add ..." to update what will be committed)
  
#   (use "git checkout -- ..." to discard changes in working directory)
  
#
  
#    modified:   readme.txt
  
#
  
no changes added to commit (use "git add" and/or "git commit -a")
  git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
  要查看具体修改了什么内容,需要用git diff这个命令
$ git diff readme.txt  
diff --git a/readme.txt b/readme.txt
  
index 46d49bf..9247db6 100644
  
--- a/readme.txt
  
+++ b/readme.txt
  
@@ -1,2 +1,2 @@
  
-Git is a version control system.
  
+Git is a distributed version control system.
  
Git is free software.
  提交修改和提交新文件是一样的两步,第一步是git add:
$ git add readme.txt  同样没有任何输出。在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:
$ git status  
# On branch master
  
# Changes to be committed:
  
#   (use "git reset HEAD ..." to unstage)
  
#
  
#       modified:   readme.txt
  
#
  git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了:
$ git commit -m "add distributed"  
[master ea34578] add distributed
  
1 file changed, 1 insertion(+), 1 deletion(-)
  提交后,我们再用git status命令看看仓库的当前状态:
$ git status  
# On branch master
  
nothing to commit (working directory clean)
  Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的。
  六:版本切换
  git log命令显示从最近到最远的提交日志,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:

  Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
  现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令:
$ git reset --hard HEAD^  
HEAD is now at ea34578 add distributed
  版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
  在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到“add distributed”版本时,再想恢复到“append GPL”,就必须找到“append GPL”的commit>git reflog用来记录你的每一次命令:
$ git reflog  
ea34578 HEAD@{0}: reset: moving to HEAD^
  
3628164 HEAD@{1}: commit: append GPL
  
ea34578 HEAD@{2}: commit: add distributed
  
cb926e7 HEAD@{3}: commit (initial): wrote a readme file

  •   HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
  •   穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  •   要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
  七:工作区和暂存区
  Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
  工作区(Working Directory):就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:

  版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

  分支和HEAD的概念我们以后再讲。
  前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
  第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
  因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
  你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
  俗话说,实践出真知。现在,我们再练习一遍,先对readme.txt做个修改,比如加上一行内容:
Git is a distributed version control system.  
Git is free software distributed under the GPL.
  
Git has a mutable index called stage.
  然后,在工作区新增一个LICENSE文本文件(内容随便写)。
  先用git status查看一下状态:
$ git status  
# On branch master
  
# Changes not staged for commit:
  
#   (use "git add ..." to update what will be committed)
  
#   (use "git checkout -- ..." to discard changes in working directory)
  
#
  
#       modified:   readme.txt
  
#
  
# Untracked files:
  
#   (use "git add ..." to include in what will be committed)
  
#
  
#       LICENSE
  
no changes added to commit (use "git add" and/or "git commit -a")
  Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked。
  现在,使用两次命令git add,把readme.txt和LICENSE都添加后,用git status再查看一下:
$ git status  
# On branch master
  
# Changes to be committed:
  
#   (use "git reset HEAD ..." to unstage)
  
#
  
#       new file:   LICENSE
  
#       modified:   readme.txt
  
#
  现在,暂存区的状态就变成这样了:

  所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
$ git commit -m "understand how stage works"  
[master 27c9860] understand how stage works
  
2 files changed, 675 insertions(+)
  
create mode 100644 LICENSE
  一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
$ git status  
# On branch master
  
nothing to commit (working directory clean)
  现在版本库变成了这样,暂存区就没有任何内容了:

  暂存区是Git非常重要的概念,弄明白了暂存区,就弄明白了Git的很多操作到底干了什么。
  八:管理修改
  Git管理的是修改,当你修改文件并用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改没有执行git add命令,此时没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
  Git每次修改,如果不add到暂存区,那就不会加入到commit中。
  九:摊销修改
  场景一:只修改工作空间没有git add到暂存区:
  git checkout -- file可以丢弃工作区的修改:
$ git checkout -- readme.txt  命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
  一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
  总之,就是让这个文件回到最近一次git commit或git add时的状态。
  git checkout -- file命令中的--很重要,没有--,就变成了“创建一个新分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
  场景二:如果git add到暂存区但没有commit
  用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。
  git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
  小结时间。
  场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
  场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
  十:删除文件
  在Git中,删除也是一个修改操作。
  一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
$ rm test.txt  这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了,现在你有两个选择,
  一种情况是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
  另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt  git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
  命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容



运维网声明 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-588828-1-1.html 上篇帖子: Git与远程仓库交互,拉取与提交数据 下篇帖子: Git 学习二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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