Git学习笔记

1.安装git

sudo apt-get install git

 

2.在命令行输入:

git config --global user.name 'Your Name'
git config --global user.email 'email@example.com'

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

 

 3.创建版本库(仓库),可以理解为是一个目录,这个目录里所有的文件都可以被Git管理起来,每个文件的修改,删除,Git都能被跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:(一般在家目录下)

chris@chris:~$ mkdir cc    #根目录下创建一个空文件夹
chris@chris:~$ cd cc    #进入这个空文件
chris@chris:~/cc$ pwd      #显示当前目录
/home/chris/cc        #此刻在linux的家目录下的cc文件夹下

 

4.通过git init命令把这个目录变成Git可以管理的本地仓库:

chris@chris:~/cc$ git init
初始化空的 Git 仓库于 /home/chris/cc/.git/

发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

 

5.把文件添加到版本库

首先在cc文件夹下(或其子文件下)创建一个‘readme.txt’的文件,用命令git add告诉Git,把文件添加到仓库:

chris@chris:~/cc$ sudo vim readme.txt   #创建readme.txt文件
chris@chris:~/cc$ git add readme.txt 

如果没有提示任何内容,这就对了。readme.txt文件如下

 

6.用命令git commit告诉Git,把文件提交到仓库:

chris@chris:~/cc$ git commit -m '第一个文件,用于测试'
[master (根提交) b684323] 第一个文件,用于测试
 1 file changed, 1 insertion(+)
 create mode 100644 readme.txt

git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

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

现在,已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下:

chris@chris:~/cc$ git add readme.txt 
chris@chris:~/cc$ git commit -m '第二次修改'
[master b17a2f0] 第二次修改
 1 file changed, 1 insertion(+)

像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。

Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

chris@chris:~/cc$ git log
commit b17a2f0a42924e797948fc5e793b37d1fd81a1bb
Author: Christian <huiyichanmian@yeah.net>
Date:   Fri Oct 19 20:58:46 2018 +0800

    第二次修改

commit b6843236540ac5525fc9750076a0e2daa1376a2e
Author: Christian <huiyichanmian@yeah.net>
Date:   Fri Oct 19 20:46:52 2018 +0800

    第一个文件,用于测试

git log命令显示从最近到最远的提交日志,我们可以看到2次提交,最近的一次是第二次修改,最早的一次是第一个文件,用于测试。

如果感觉看的眼花缭乱,可以用  git log --pretty=oneline

chris@chris:~/cc$ git log --pretty=oneline
b17a2f0a42924e797948fc5e793b37d1fd81a1bb 第二次修改
b6843236540ac5525fc9750076a0e2daa1376a2e 第一个文件,用于测试

 

现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是‘第一个文件,用于测试’的那个版本,怎么做呢?

首先,Git必须知道当前版本是哪个版本,我们可以用git reflog 查看每个版本的版本号,然后git reset --hard 版本号 回退到相应的版本(git reset --hard HEAD~n没有实验成功,这里不班门弄斧)

chris@chris:~/cc$ git reflog
b17a2f0 HEAD@{0}: commit: 第二次修改 b684323 HEAD@{
1}: commit (initial): 第一个文件,用于测试 chris@chris:~/cc$ git reset --hard b684323 HEAD 现在位于 b684323 第一个文件,用于测试

chris@chris:~/cc$ git reset --hard b17a2f0
HEAD 现在位于 b17a2f0 第二次修改

 

7.版本库

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

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

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add 文件名 把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

在工作区重新创建一个文件,test.txt,对原有的readme.txt进行一次修改。然后用git status查看一下状态

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

修改: readme.txt

未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)

test.txt

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

git 明确告诉我们。readme.txt被修改了,而且是暂存以备提交的变更,test.txt从未跟踪过。

现在,使用两次命令git add,把readme.txttest.txt都添加后,用git status再查看一下:

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

    修改:     readme.txt
    新文件:   test.txt

 此时暂存区应该是这样子的:

git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。,

chris@chris:~/cc$ git commit -m '提交两个文件'
[master e4fdae1] 提交两个文件
 2 files changed, 2 insertions(+)
 create mode 100644 test.txt

一旦提交后,如果没有对工作区做任何修改,那么工作区就是“干净”的:

chris@chris:~/cc$ git status 
位于分支 master
无文件要提交,干净的工作区

现在版本库变成了这样,暂存区就没有任何内容了:

 

8.管理修改

Git跟踪并管理的是修改,而非文件。

还是老样子,修改readme,txt文件

chris@chris:~/cc$ cat readme.txt 
这是一个测试文件。
第二次修改。
第三次修改
这是第四行

然后 git add 添加到暂存区

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

    修改:     readme.txt

继续修改readme.txt

这是一个测试文件。
第二次修改。
第三次修改
这是第四行
这是第五行

用git commint 提交,然后查看状态

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

    修改:     readme.txt

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

明明提交了,怎么提示没有被提交呢。

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

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

提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别:

chris@chris:~/cc$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 68dcdde..b761a7b 100644
--- a/readme.txt
+++ b/readme.txt
@@ -2,3 +2,5 @@
 第二次修改。
 第三次修改
 这是第四行
+这是第五行
+

那怎么提交第二次修改呢?你可以继续git addgit commit。

 

9撤销修改

在工作中我们难免会犯错,在你刚准备要提交的时候及时发现错误,就很容易去纠正它。

手动把文件恢复到上一个版本的状态,用git status查看一下

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

    修改:     readme.txt

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

 

你可以发现,git 会告诉你,git checkout -- file可以丢弃工作区的修改:

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

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

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

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

然后你会发现文件内容果然复原了。

 

如果git add到了缓存区,但是还没有commit,你发现了问题,用git status查看,修改只是添加到了缓存区,还没有提交。

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

    修改:     readme.txt

 

git同样告诉我们,用命令git reset HEAD <file>可以把暂存区的修改撤销,重新放回工作区

chris@chris:~/gityum$ git reset HEAD readme.txt
重置后取消暂存的变更:
M    readme.txt

 

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

再次使用git status查看,现在缓存区是干净的,工作区有修改

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

    修改:     readme.txt

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

 

然后在使用git checkout -- <file>丢弃工作区的修改。

如果你不但改错了东西,还从缓存区提交到了版本库,这时候我们用上面讲的,

我们可以用git reflog 查看每个版本的版本号,然后git reset --hard 版本号 回到这个指定的版本,前提是没有推送到远程库。

撤销文件操作的总结:

  当你改乱了工作区的某个文件,想直接丢弃工作区修改,用git checkout -- file

  当你不但改乱了工作区某个问价内容,还添加到暂存区,想丢弃修改,,分两步,用git reset HEAD <file>回退到工作区,然后重复上面的操作。

  当已经提交了不合适的修改的内容到版本库,想要撤销本次操作,用git reflog查看每个版本的版本号,git reset -- hard 版本号  会退到指定的版本。

 

10 删除文件操作

在git中,删除也是一种修改操作,前面我们添加了一个test.txt文件并提交到了版本库

一般情况下,我们会通常在文件管理其中把没用的文件删除,或者用rm命令

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

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

    修改:     readme.txt
    删除:     test.txt

 

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

chris@chris:~/gityum$ git rm test.txt 
rm 'test.txt'
chris@chris:~/gityum$ git commit -m '删除文件'
[master fa3b2eb] 删除文件
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt

 

现在问价那就从版本库中删除了。

第二种情况是,删错了,因为版本库中还有,所以可以轻松的把误删文件恢复到最新版本

git checkout -- test.txt

git checkout 其实使用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以一键还远。

 

建立远程仓库

首先到托管服务器上创建一个空版本库,例如在github、coding、oschina等、

然后克隆到本地(clone)创建一个新项目

或者可以通过初始化项目创建一个新项目 git init

  • git remote add origin 远程仓库地址

  • 添加代码文件(git add)

  • 提交代码到本地库 git commit -m

  • 将代码推送到远端服务器 git push

  • 从远端服务器拉取代码git pull

冲突管理 

  • 如果有多个人同时修改同一个文件的相同行,在推送时会有冲突

  • 发生冲突后,首先将服务器端代码拉到本地(pull),手动合并冲突

  • 然后添加修改后的代码文件,重新提交

  • 将代码推送到服务器

 

创建公钥

  

ssh-keygen -t rsa -C yourname

 

进入.ssh目录,查看  id_rsa.pub文件,复制密钥

登录github,设置,填入密钥,下次推送就不用登录github的账号密码了。

 

posted @ 2018-10-20 00:42  李大鹅  阅读(967)  评论(0编辑  收藏  举报