在安装好git之后
创建Repository(版本库)
repository里面的所有文件都能够被git管理起来,文件的修改、删除都能够被git跟踪,每一个版本都会有记录。
- 创建版本库
#新建learngit文件夹
mkdir learngit
#进入learngit文件夹
cd learngit
#显示当前路径
pwd
得到当前路径
- 通过
git init
命令初始化版本库
git init
初始化后git仓库文件夹下,会产生一个隐藏目录/.git
,用来跟踪管理版本库(不可以乱改哦),ls -ah
命令可以看到;
添加文件到版本库
在./learngit
目录下新建readme.txt
Git is a version control system.
Git is free software.
先通过git add
将文件添加到仓库
git add readme.txt
git add -<opt>
可以简化提交过程:git add -u
提交所修改(modified)和被删除(deleted)文件,不包括新文件(new)git add .
提交新文件(new)和被修改的文件(modified),不包括被删除文件(deleted)git add -A
提交所有变化
使用git commit
提交文件
#可以直接commit,之后再写日志内容
git commit
#也可以通过-m快速记录日志文件
git commit -m "wrote a readme.txt file"
- 我们可以通过
git status
查看当前工作区状态,比如我对readme.txt
进行了修改,就可以看到有哪些改动;
git status
- 如果想具体查看是哪些内容进行了改动可以通过:
git diff
进行查看
得知哪个文件进行了改动,重复最开始的两步:
git add readme.txt
git commit
如此时再进行git status
,是没有修改的,而且工作目录为空的。
如果我们想要全部添加进版本库,但是要排除某几个文件该怎么办呢?
git add .
git reset -- <filename>
这里顺便讲一下git add .
, git add - u
, git add -A
的区别:
git add .
:会将工作时的变化提交到暂存区,包括文件修改(modified)以及新文件(untracked),但不包括删除文件(deleted);
git add -u
:仅监控已经被add的文件,即tracked file,将被修改的文件modified包括 被删除的文件(deleted) 提交到暂存区,不会提交未被监控的新文件(untracked );
git add -A
:提交所有变化,是上述两种功能的集合;
git reset -- <filename>
:将加入到暂存区的内容恢复到untracked状态;
时间轴线
通过各种命令操作使我们在时间线上进行的各种操作进行回退或恢复;
版本回退
我们重新修改readme.txt
重新提交一版;
Git is a distributed version control system.
Git is free software distributed under the GPL.
- 通过
git log
可以查看由近到远的提交日志
git log --pretty=oneline
加上这个参数会简化每条说明至一行:
每一个日志前面的一大串数字都是commit id
版本号,为了方便多人提交这是一个通过SHA1计算出来的庞大十六进制数字,以防冲突; - git中,使用
HEAD
指针指向当前版本,如果想进行回退指向上一版本使用HEAD^
,上上版本是HEAD^^
,往上100版本是HEAD~100
:
此时回退一个版本,使用git reset
:
git reset --hard HEAD^
版本回退后,readme.txt
内容也恢复到了上一版本:
此时进行git log
查看版本信息已经只有当前版本与更早的了,没有回退之前的版本了:
此时如果我们还想恢复的话,可以通过指定版本号,并不需要完整的版本号,只需要前几位便可恢复:
git reset --hard 78e02
使用git reflog
可以查看之前进行所有的命令:
修改撤销
当你失误不小心添加了一些错误的内容:
你想丢弃工作区的修改,这是可以通过:git checkout -- file
,--
十分重要不然语义变成“切换到另一个分支”;
git checkout -- readme.txt
将readme.txt文件在工作区的修改全部撤销,这里有两种情况:
- readme.txt修改之后还没有放入暂存区,撤销修改就回到和版本库一样的状态;
- readme.txt已经添加暂存区,又做了修改,这样撤销修改就回到添加到暂存区后的状态;
这里说一下工作区与暂存区的概念:
-
工作区(Working Directory)
即电脑里能看到的目录,比如learngit文件夹就是一个工作区; -
暂存区(Stage)
工作区里有一个隐藏目录.git
,这个是git的版本库,其中就有暂存区(stage),以及Git为我们自动创建的第一个分支master
(指向master
的第一个指针叫head
)。
当我们将文件往Git版本库里添加的时候,分两步执行:
- 用
git add
将文件添加进去,这个时候就是将文件修改添加到暂存区; - 用
git commit
提交更改,这就是将暂存区的内容提交当当前分支;
- 用
删除文件
linux命令先删除文件rm test.txt
,这样操作并不会影响已提交版本库中的文件,如果此时想要恢复通过check out -- file
即可;
接下来要在git中确认删除文件:
git rm file
git commit
这样操作就会将版本库中的文件给删除掉,无法恢复!!!慎重!
远程仓库
使用Github
添加远程仓库
通过SSH将本地Git仓库与远程GitHub仓库建立连接:
- 创建SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
- 在用户主目录下(
/root
),查看.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个是SSh Key的秘钥对,id_rsa
为私钥绝不能泄露,id_rsa.pub
是公钥,可以放心告诉别人; - 将公钥复制进github.com账户里面的SSH页面:
- 新建远程仓库
learngit
- 本地仓库关联远程仓库
git remote add origin git@github.com:snowCreaml/learngit.git
这里的orgin
是远程仓库默认的名字(这样一看这个名字就知道是远程仓库);
git push -u origin master
将本地库所有内容推送到远程库上,使用git push
默认将本地当前分支master
推送到远程了,-u
是将本地master
分支关联至远程的master
分支,以后的推送就不需要了可以直接使用git push origin master
;
在我们推送之后,可以看到Github中的远程库已经有了我们本地库的内容!
第一次使用SSH连接Github可以会有警告,回复yes
,会将Github的key加入known hosts中,以后就不会有警告了;
解绑远程库
git remote -v
可以查看到远程库的信息;
使用git remote rm orgin
可删除orgin库,这里的“删除”实际上是解绑了本地与远程的绑定关系,远程仓库的存在并不受影响,如果想真正的删除远程库需要到Github中进行删除操作;
克隆远程库
使用命令git clone
克隆远程库getskills至本地库:
git clone git@github.com:snowCreaml/gitskills.git
分支管理
分支创建与合并
git创建分支使用git branch <name>
,科学切换分支使用git switch <name>
;
git branch dev
git switch dev
键入git branch
能够查看当前分支
上述创建并切换分支也可以简化为:
git switch -c dev
老式语言也可以通过git checkout <name>
切换分支,不过与我们上文所说的撤销修改git checkout -- <file>
有些语义歧义;
我们在dev
分支对readme.txt进行修改,然后进行提交;
git add readme.txt
git commit -m "branch test"
git branch master
之后我们再切换回master
分支,会发现我们的修改在master
下并看不到;
我们想将dev
分支的工作成果合并到master
分支上,使用git merge dev
git merge dev
此处提示中的Fast-forward
信息,是"快进模式"。将master
指针指向dev
指向的节点,合并速度非常快,后续还会有其他合并方式讲解;
合并后在master
分支下就可以看到dev
分支下进行的修改了,此时我们可以将dev
分支删除掉:
git branch -d dev
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
原理
git的分支实际上是通过指针进行实现的,主分支master
是一条时间线,每一次提交都是一个节点版本,master
便向前进一步,HEAD
指向master
即也指向当前分支;
当我们创建了一个新分支dev
后,切换指针HEAD
指向dev
,从此再进行提交就是对dev
分支进行修改了;
此时我们进行合并,就是将master
指针指向dev
,便完成了合并,工作区内容没有改变;
完成合并后,我们想删除dev
分支,便又回到了原始的状态;
设置远程分支
1、
# Set upstream when pushing to remote
git push -u origin <branchname>
2、
# Set upstream without pushing it
# with option -u / --set-upstream-to
git branch -u origin/<branchname>
git branch --set-upstream-to=origin/<branchname>