Git学习记录(一)

参考网址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

Table of Contents

安装Git

创建版本库

修改提交

版本回退

工作区和暂存区

管理修改

撤销修改

删除文件



安装Git

sudo apt-get install git(debian and ubuntu)

创建版本库

创建一个空目录,并变成git可以管理的仓库,目录下多出.git的目录

mkdir learngit
cd learngit
git init
ls -ah

把文件添加到版本库

注意:

首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

创建readme.txt,添加,保证在git管理的目录下或者子目录下创建,提交到仓库

git add readme.txt
git commit -m "wrote a readme file"

-m后面输入的是本次提交的说明

为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files."

修改提交

如果我们对readme 进行修改,可以看到如下内容(有的为English)

git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     readme

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。需要用git diff这个命令看看:

git diff readme
diff --git a/readme b/readme
index 7f112b1..7dda0f5 100644
--- a/readme
+++ b/readme
@@ -1,2 +1,2 @@
 hello git
-
+learn git

知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步

git add readme
git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	修改:     readme

git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了:

git commit readme -m "add learn"

版本回退

在Git中,我们用git log命令查看历史记录:

 

git log
commit ..... (HEAD -> master)
Author: .....
Date:   Mon Mar 25 10:51:49 2019 +0800

    add learn

commit .....
Author: .....
Date:   Mon Mar 25 10:42:59 2019 +0800

    wrote a readme file

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数.

Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100.可以使用git reset命令回退.

git reset --hard HEAD^
HEAD 现在位于 921b037 wrote a readme file
cat readme 
hello git

如果想要返回"add learn"版本的话,git log后的信息里面没有他了,只要你的shell窗口没有关闭,你可以找到它的commit id进行回退,当然所有的回退都可以用commit id.

git reset --hard bd2e69f2513f0108e932d5f5b323b9e5e163ff7f
HEAD 现在位于 bd2e69f add learn

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向"add learn"

Git提供了一个命令git reflog用来记录你的每一次命令,这样你就可以找到"add learn"的commit id:

git reflog
bd2e69f (HEAD -> master) HEAD@{0}: reset: moving to bd2e69f2513f0108e932d5f5b323b9e5e163ff7f
921b037 HEAD@{1}: reset: moving to HEAD^
bd2e69f (HEAD -> master) HEAD@{2}: commit: add learn
921b037 HEAD@{3}: commit (initial): wrote a readme file
bobo@bobo-Vostro-3459:~/learngit$ git reset --hard 921b037

注意:前方标示的就是commit id(变短了...)


工作区和暂存区

你创建的目录就是工作区即learngit.之前提到的.git 目录是版本库.

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。下图侵删

结构图1

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的.

结构图2


管理修改

Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

那怎么提交第二次修改呢?你可以继续git addgit commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了:

第一次修改 -> git add -> 第二次修改 -> git add -> git commit


撤销修改

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。


删除文件

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add/rm <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	删除:     readme

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

git rm readme
rm 'readme'
git commit -m "remove readme"
[master 2ff850d] remove readme
 1 file changed, 2 deletions(-)
 delete mode 100644 readme

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

git checkout -- readme

ls
readme

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值