前言
由于自己电脑上安装了双系统,在Linux和Win上统一代码版本需要用到这样一个版本控制工具,所以在学习了廖雪峰的Git教程后写了这样一篇博客帮助自己记忆。
分布式 和 集中式
集中式:大家使用共同的一个服务器进行代码库的储存,各自修改之后上交改动
分布式:每个人本地都有完整代码库,可以仅仅通过交换修改的部分进行版本控制
具体使用
Linux上可以直接使用Terminal进行命令输入,Win上使用Git Bash
自爆家门
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
用于让别人知道你是谁
创建版本库(repository)
你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
输入(win须无中文父目录):
创建空目录:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
初始化git,进而该本地仓库可以通过git管理:
$ git init
如果像要对该文件夹中的某个文件进行管理,比如readme.md
,可以将其添加入git的管理范畴:
$ git add readme.md
如果觉得已经没问题了,可以使用git commit命令同步到仓库:
$ git commit -m 'write a readme file'
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
如果对该文件进行改动之后,可以使用git status
查看改动。如果显示以下结果:
$ 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: readme.md
no changes added to commit (use "git add" and/or "git commit -a")
说明文件已经被改动了,但是改动的文件还未传到仓库,所以我们可以通过git diff
命令具体查看改动内容:
$ git diff
warning: LF will be replaced by CRLF in readme.md.
The file will have its original line endings in your working directory
diff --git a/readme.md b/readme.md
index d1c6469..e862f7f 100644
--- a/readme.md
+++ b/readme.md
@@ -1 +1,3 @@
hello git!
+
+i write one more line here
如果知道了修改了哪些内容,就可以放心的传入仓库:
$ git add readme.md
$ git commit -m 'add a new line'
然后不断对代码进行修改,上传,修改,传入,当有一天想知道之前都修改了些啥时,可以通过git log
命令获取修改记录,这就是版本控制系统的核心
$ git log
commit 286b269ca98c541c0ff6cb3fb6fca03aa8cc05b6 (HEAD -> master)
Author: allimpossible <zhuangbidafa@gmail.com>
Date: Mon Feb 25 08:37:05 2019 +0800
add a new line
commit e074e093ee018099f7ef72b3fc9dc7eb2cdb81b0
Author: allimpossible <zhuangbidafa@gmail.com>
Date: Mon Feb 25 08:23:50 2019 +0800
write a readme file
从返回的结果可以看到不同的版本都做了哪些修改,这些修改都是以自己之前commit
的形式呈现出来的,所以可见有一个好的commit
对于日后的回忆有着多么重要的意义。
版本回退
当自己对目前的版本不满意时,可以使用如下命令回退到上一个版本:
$ git reset --hard HEAD^
HEAD^^
则表示上上个版本,HEAD~100
表示上100个版本
但是此时如果使用git log
命令会发现之前最新的那个版本不在了,如果又想回去的话,可以使用另一种方法:
$ git reset --hard e074e
HEAD is now at e074e09 write a readme file
即通过在 --hard
参数后面写版本号(前几位就够了),git就会检索到该版本并进行回溯。
如果忘记了之前的版本号,则可以使用git reflog
查看历史操作记录
一些名词解释
工作区(Working Directory)
就是这些代码存放的一个目录,如之前pwd
显示的目录。
版本库(Repository)
即那个隐藏目录.git
。
Git的版本库里存了很多东西,其中最重要的就是称为stage
(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。git有暂存区,这是和其他版本控制系统不同的一点。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
现在如果我们对之前的文件进行一定的修改,并且新增一个文件在当前工作区:
$ 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: learngit.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
git1.py
no changes added to commit (use "git add" and/or "git commit -a")
结果告诉我们,有一个文件被修改了,而有一个文件新增的但是并未被管理,即处于untracked状态,然后我们需要手动将这两个文件add
入暂存区。随后如果再commit
的话就可以将暂存区的所有文件送到master分支上,此时的工作区状态即为:
$ git status
On branch master
nothing to commit, working tree clean
所以,git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。而commit
代表的就是下2图的过程:
撤销修改
如果在git add
或者git commit
之后发现自己的文件有问题,有些地方修改错了,现在需要撤回一些操作,就可以使用git checkout -- readme.md
命令撤销上一次修改。这时就有两种情况:
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit
或git add
时的状态。
git checkout -- file
命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout
命令。
删除文件
当在工作区删除文件后,如果想在版本库中也删掉,就要使用git rm
删掉文件并且将其git commit
。如果是误删,可以使用git checkout -- readme.md
恢复到最新版本
远程仓库
使用github充当远程代码库进行代码托管
创建SSH-KEY
如果已经有了,则可以跳过下一步:
$ ssh-keygen -t rsa -C "youremail@example.com"
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
登录github,添加SSH
如果想要多台电脑都得到认证,就需要添加每一台电脑的公钥
添加远程库
目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:
$ git remote add origin gitgit@github.com:idhere/DL-learn.git
添加之后,远程库的名字就是orgin
。
要将本地的内容推送到远程库保存的话。需要使用git bash
命令,其实就是把当前的master
的分支推送到了远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
随后如果还想推送新代码的话就只需要如下命令:
$ git push origin master
创建与合并分支
其中指针具体的工作方式见here
- 首先是创建dev分支,并切换到该分支
$ git checkout -b dev
-b
参数表示创建并切换,相当于将如下两步合起来
$ git branch dev
$ git checkout dev
然后使用git branch
命令查看当前分支:
$ git branch
* dev
master
如果此时对文件进行一定的修改,比如添加几行,然后在dev
分支上add , commit
之后,使用git checkout master
切回master
时,之前添加的几行不在了,因为刚刚只是在dev
分支上进行的改动。
使用git merge dev
命令进行合并:
$ git merge dev
Updating 9f6078e..d54e31d
Fast-forward
git1.py | 4 ++++
1 file changed, 4 insertions(+)
git merge
命令用于将指定分支合并到当前分支,合并完成过后,就可以删除dev
分支了,使用如下命令:
$ git branch -d dev
Deleted branch dev (was d54e31d).