原文: 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添加文件需要add
,commit
一共两步呢?因为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.txt
和test.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 add
再git 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的账号密码了。
2019-12-26 12:59:47
此外还有一篇也可以看看。https://blog.csdn.net/h247263402/article/details/74849182
稍后整理