GIT笔记

1、GIT简历

  同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。1991年,Linus 创建了开源的 Linux,并且有着为数众多的参与者。虽然有世界各地的志愿者为 Linux 编写代码,但是绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。在这期间,所有的源代码都是由 Linus 手工合并。

  因为 Linus 坚定地反对 CVS 和 SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。虽然有一些商用的版本控制系统,比 CVS、SVN 好用,但那是付费的,和 Linux 的开源精神不符。

  不过,到了 2002 年,Linux 系统已经发展了十年了,代码库之大让 Linus 很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是整个项目组启用了一个商业版本的分布式版本控制系统 BitKeeper 来管理和维护代码。BitKeeper 的东家 BitMover 公司出于人道主义精神,授权Linux 社区免费使用这个版本控制系统。

  安定团结的大好局面在 2005 年被打破,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,原因是 Linux 社区牛人聚集,开发 Samba 的Andrew 试图破解 BitKeeper 的协议,这么干的其实也不只他一个,但是被 BitMover 公司发现了,于是 BitMover 公司收回了 Linux 社区的免费使用权。这就迫使 Linux 开源社区( 特别是 Linux 的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。

  他们对新的系统制订了若干目标:速度、简单的设计、对非线性开发模式的强力支持(允许上千个并行开发的分支)、完全分布式、有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)。自诞生于 2005 年以来,Git 日臻成熟完善,迅速成为最流行的分布式版本控制系统,在高度易用的同时,仍然保留着初期设定的目标。它的速度飞快,极其适合管理大项目,它还有着令人难以置信的非线性分支管理系统,可以应付各种复杂的项目开发需求。2008 年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数开源项目开始迁移至 GitHub,包括 jQuery,PHP,Ruby 等等。

历史就是这么偶然,如果不是当年 BitMover 公司威胁 Linux 社区,可能现在我们就没有免费而超级好用的 Git 了。

2、基本用法

2.1、配置GIT全局属性(初始化)

    每个开发者都有个自己的ID、邮箱,当使用GIT的时候首先应该设置自己的用户名

设置用户名和邮箱:

git config --global user.name "dayibalang" git config --global user.email "325122062@qq.com" 

查看所有的全局属性配置命令:

git config --list 

2.2、创建GIT本地仓库

  如果想想要进行代码管理,那么必须需要一个仓库,可以是本地仓库,也可以是网络仓库。 创建一个文件夹,把该文件夹设置为仓库,创建好后需要要进入到改文件夹里面执行仓库初始化。

范例:本地初始化命令:

git init 

范例:网络服务器初始化命令

git init --bare 

两个命令的区别是本地初始化命令会在仓库目录下创建一个隐藏文件夹名叫.git里面会有一堆配置,而用网络服务器初始化命令,没有.git文件夹,直接将.git目录下的文件创建在仓库目录。

2.3、仓库基础操作

仓库目录下创建活更新文件操作都会自动被git跟踪到。
1、在仓库创建Lin.txt文件,输入哈哈哈保存

哈哈哈 

2、范例:查看当前仓库的状态

git status 
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Lin.txt nothing added to commit but untracked files present (use "git add" to track) 

输入命令查看当前仓库状态命令,返回的内容是告诉我们Lin.txt不属于git仓库里面的内容,需要自己使用git add 文件名添加到git当中。
3、将Lin.txt添加到GIT仓库中进行管理

git add Lin.txt 

4、继续查看GIT状态

git status 
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage) new file:   Lin.txt 

敲了git add后只是表示这个文件待入库状态,但是并没有提交到仓库里面,相当于加入了缓存区。现在操作缓存区里面的日志可以用git rm --cached 文件名进行从缓冲区删除(并不会删除真实的文件)或者使用git commit -m "提交注释"进行提交。

5、提交更新

git commit -m "我创建了一个Lin.txt文件" 
[master (root-commit) 688a81e] 我创建了一个Lin.txt文件 1 file changed, 1 insertion(+)
 create mode 100644 Lin.txt

Warning: Your console font probably doesn't support Unicode. If you experience strange characters in the output, consider switching to a TrueType font such as Consolas! 

6、多文件入库 现在创建多几个文件

文件名称 内容
Lin1.txt 嘤嘤嘤
Lin2.txt 嘻嘻嘻

现在重新执行查询状态命令

git status 
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        Lin1.txt
        Lin2.txt nothing added to commit but untracked files present (use "git add" to track) 

现在表示Lin1.txt和Lin2.txt都在待入库状态,按照逻辑需要一个一个的添加,这样子太麻烦了。
敲入以下三个命令(根据自己所需要的需求选择一条命令即可):

git add -A 保存所有的修改  git add . 保存新的添加和修改,但是不包括删除  git add -u 保存修改和删除,但是不包括新建文件。 

在敲入查询状态:

git status 
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage) new file: Lin1.txt new file: Lin2.txt 

现在状态已经加入缓冲区了,只需要提交即可

git commit -m "我创建了一个Lin1.txtLin2.txt文件" 
[master 582cf24] 我创建了一个Lin1.txtLin2.txt文件 2 files changed, 2 insertions(+)
 create mode 100644 Lin1.txt
 create mode 100644 Lin2.txt

Warning: Your console font probably doesn't support Unicode. If you experience strange characters in the output, consider switching to a TrueType font such as Consolas! 

2.4、修改仓库文件

  GIT会跟踪所有的文件,所有要是有某个文件进行了修改,GIT也是可以监听到的。

1、现在修改Lin.txt文件加入你要加油鸭

你要加油鸭 

2、敲入查询状态命令

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:   Lin.txt no changes added to commit (use "git add" and/or "git commit -a") 

检查到已经修改的文件,现在有两种解决方案

  • 使用git add将新修改的文件提交到"缓冲区"
  • 使用git checkout 放弃本地更新,使用仓库里面的文件更新到本地(相当于SVN的回滚)

3、查看本地的和仓库里面的文件修改了那些地方

git diff lin.txt 
diff --git a/Lin.txt b/Lin.txt index 1826314..dd7c9b5 100644 --- a/Lin.txt +++ b/Lin.txt
@@ -1 +1,2 @@
-哈哈哈 \ No newline at end of file +哈哈哈 +你要加油鸭 \ No newline at end of file 
  • 在命令行的时候如果是追加的代码会用绿色来表示
  • 如果是删除会用红色来表示
  • 如果是那种没有删除行也没有追加行而是修改了某一行,GIT会当做你删除了然后在追加,GIT不能检测到你的修改。

4、如果不想修改,使用检出(回滚)

git checkout Lin.txt 
Updated 1 path from the index 

5、如果是想修改只需要add后在提交

git add . 
git commit -m "修改了Lin.txt文件,在里面加入,你哟啊加油鸭" 
[master 51eb106] 修改了Lin.txt文件,在里面加入,你哟啊加油鸭 1 file changed, 2 insertions(+), 1 deletion(-) Warning: Your console font probably doesn't support Unicode. If you experience strange characters in the output, consider switching to a TrueType font such as Consolas! 

2.5、仓库的概念深入理解

目前我们GIT操作流程是

  1. 本地创建或者修改文件,
  2. 使用“git add”提交到缓存空间
  3. 在使用“git commit”提交到GIT仓库

工作区、暂存区和版本库(分支master)的概念

  • 工作区:指的是本地的文件(本地的代码)
  • 暂存区:当操作了本地文件,调用“git add”操作修改的文件会被存在暂存区
  • 版本库:当提交到缓冲区在使用“git commit”在会提交到版本库

操作流程:工作区->暂存区->版本库

当每次使用"git commit"提交,永远是提交暂存区里面的内容,比如我现在创建了一个文件叫123.txt,里面现在内容是123 我使用了“git add”,这里已经提交到缓存区了,然后我又修改了本地的123.txt,将123改成123456。这里要是使用“git status”,会发现暂存区有一个待提交的文件,工作区有个修改的文件。如果现在用"git commit"提交,git仓库里面的内容就是123,并不是123。

2.6 版本穿越

git中最大的特点,可以针对不同的代码回退与前进动态处理,每次提交git是记录了日志的,并且每次提交git会生成一个commit ID数据

范例:查看所有的commit ID

git log 
commit 5d6b04842c9b37b2845d47f26154c308a982d94a (HEAD -> master)
Author: lin <325122062@qq.com>
Date:   Thu Jun 27 11:07:44 2019 +0800 u-123.txt a-lin.txt

commit 21c498933f2d9c8083f329694515d70393e4707b
Author: lin <325122062@qq.com>
Date:   Thu Jun 27 10:59:15 2019 +0800 ccc 

学习的时候被这个退出坑到了,英文状态按字母Q即可退出。

范例:简化列出

git log --pretty=oneline 
5d6b04842c9b37b2845d47f26154c308a982d94a (HEAD -> master) u-123.txt a-lin.txt 21c498933f2d9c8083f329694515d70393e4707b ccc 

范例:回退到上一个保存的版本

git reset --hard HEAD~1 

这个命令有个问题,只能恢复最近上一次保存点,要想恢复上上次,或者很久以前的修改,需要用使用查看所有的提交点,然后在恢复到指定的提交点

范例:查看所有的提交点

git reflog 
5d6b048 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1 ce58545 HEAD@{1}: commit: u-lin.txt 5d6b048 (HEAD -> master) HEAD@{2}: commit: u-123.txt a-lin.txt 21c4989 HEAD@{3}: commit (initial): ccc 

范例:恢复到指定的提交点(ce58545是可以修改的,根据查看所有提交点返回的id修改)

git reset --hard ce58545 
HEAD is now at ce58545 u-lin.txt 

2.7、撤销修改

由于GIT针对所有工作目录文件信息进行了监控出来,所有如果在工作目录下的内容需要进行变更,也需要考虑到两种情况。

  • 情况一:在工作区中发生了改变,但是此时没有提交到暂存区(未add)
  • 情况二:将修改的内容已经添加到暂存区,但是还未提交的版本库(已add)
  1. 修改一个文件,(这里修改123.txt文件,原来的文件是内容是111111111111,现在加上66666)

范例:敲入查询状态

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: 123.txt no changes added to commit (use "git add" and/or "git commit -a") 
  1. 如果现在没有提交到缓存区,想撤销,原始的文件内容
git checkout 123.txt 
Updated 1 path from the index 
  1. 如果此时修改了文件,并且这个文件已经提交到了(已经git add)暂存区之中在使用git checkout命令
git checkout 123.txt 
Updated 0 paths from the index 
  1. 这时候会发现git checkout命令完全不起作用了现在可以使用git reset HEAD命令在使用git checkout
    git reset HEAD <文件名> 表示将文件放回工作区
git reset HEAD 123.txt 
Unstaged changes after reset: M 123.txt 

在进行撤销

git checkout 123.txt 
Updated 1 path from the index 
  1. 如果你的代码更新已经提交的版本库里面,想撤销,只能利用- 2.6、版本穿越的方式完成了。
转载请注明来源:大尾巴狼博客/文章链接: 百度未收录
正文到此结束
吐槽0发
提交评论