2019-07-31 git使用

1. git简介以及安装

什么是git?
Git 是一个分布式版本控制系统
安装

  1. 下载包后默认安装即可 官网地址
  2. 安装完成后,鼠标右击出现 Git Bash,输入个人信息
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

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

2. git命令行具体操作

命令行目录:F:\study_git

1. 创建版本库

什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”

通过命令 git init 把这个目录变成git可以管理的仓库,如下:

season@DESKTOP-39IOB32 MINGW64 /f/study_git
$ git init
Initialized empty Git repository in F:/study_git/.git/

执行命令后会在文件夹中多出名为 .git (不要删除修改该文件!)

2.把文件添加到版本库中

版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。

创建readme.txt 并在第一行输入1111111111

第一步:使用命令 git add readme.txt添加到暂存区里面去。没有任何提示,说明已经添加成功了。
第二步:用命令 git commit告诉Git,把文件提交到仓库。

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git add readme.txt

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -m 'readme.txt提交'
[master (root-commit) 0b0c94a] readme.txt提交
 1 file changed, 1 insertion(+)
 create mode 100644 readme.txt

现在我们已经提交了一个readme.txt文件了
我们下面可以通过命令git status来查看是否还有文件未提交,如下是没有任何文件未提交:

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
nothing to commit, working tree clean

readme.txt 第2行输入2222222222

season@DESKTOP-39IOB32 MINGW64 /f/study_git (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 状态是指:文件已修改, 仅仅是修改, 并没有进行其他的操作.. 这个文件也有两个去处, 通过git add可进入暂存区Index状态, 使用git checkout 则丢弃修改过,返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改


        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。
想查看readme.txt文件到底改了什么内容.可使用git diff readme.txt,如下:

# 比较当前文件和暂存区文件差异
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git diff readme.txt
#进行比较的是,a版本的readme.txt(即变动前)和b版本的readme.txt(即变动后)。
diff --git a/readme.txt b/readme.txt 
#index区域的aa75558对象,与工作目录区域的a2b3d06对象进行比较,
# 最后的六位数字 100644 是对象的模式(普通文件,644权限)。
index aa75558..a2b3d06 100644
#"---"表示变动前的文件
--- a/readme.txt
#"+++"表示变动后的文件
+++ b/readme.txt

#变动的位置用两个@作为起首和结束
#前面的" -1":减号表示变动前(即a版本的readme.txt),"1"表示第1行;连续1行.合在一起,就表示第一个文件从第1行开始的连续1行
#后面的"+1,2":表示变动后文件(b版本的readme.txt)从第1行开始的连续2行。
#简单理解为a版本的1行与b版本的1-2行有差异,下面才是具体的差异信息
@@ -1 +1,2 @@
#-部分表示减少的部分 -红色
-1111111111
\ No newline at end of file #\ No newline at end of file 最后一行没有换行
#+部分表示增加的部分 -绿色
+1111111111^M
+2222222222
\ No newline at end of file

之后我们提交修改(git add)和提交文件(git commit)

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git add readme.txt

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt


season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -m "文件增加22222222内容"
[master 9b7b4c2] 文件增加22222222内容
 1 file changed, 2 insertions(+), 1 deletion(-)

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
nothing to commit, working tree clean
3. 版本回退

继续修改readme.txt文件

readme.txt 第3行输入3333333333

继续提交修改(git add)和提交文件(git commit)

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git add readme.txt

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -m "文件增加333333333内容"
[master d93833d] 文件增加333333333内容
 1 file changed, 2 insertions(+), 1 deletion(-)

使用git log查看历史:

$ git log
commit d93833d7ca4e1e66d6a00cef169b6e2aedc8cc6c (HEAD -> master)
Author: 董诗笑 <1208082622@qq.com>
Date:   Wed Jul 31 14:45:54 2019 +0800

    文件增加333333333内容

commit 9b7b4c2bb8f8c670d7dab638a2c274574e4ca5d5
Author: 董诗笑 <1208082622@qq.com>
Date:   Wed Jul 31 14:42:15 2019 +0800

    文件增加22222222内容

commit 0b0c94ae38aed838c7612c64cb7fbc7eba5c7a3d
Author: 董诗笑 <1208082622@qq.com>
Date:   Wed Jul 31 11:42:06 2019 +0800

    readme.txt提交

git log命令显示从最近到最远的显示日志,我们可以看到最近三次提交,最近的一次是,增加内容为333333.上一次是添加内容222222,第一次默认是 111111.如果嫌上面显示的信息太多的话,我们可以使用命令 git log --oneline 演示如下:

$ git log --oneline
d93833d (HEAD -> master) 文件增加333333333内容
9b7b4c2 文件增加22222222内容
0b0c94a readme.txt提交

回退到某个版本

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#回退到你想要的版本 9b7b4c2=>指版本号缩写
$ git reset --hard 9b7b4c2
HEAD is now at 9b7b4c2 文件增加22222222内容
#再次查看历史,发现我们的3333333没有了
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#可以看到readme.txt文件中只有前面两行数据,第三行的3333333没了
$ cat readme.txt
1111111111
2222222222

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
$ git reflog
9b7b4c2 (HEAD -> master) HEAD@{0}: reset: moving to 9b7b4c2
d93833d HEAD@{1}: commit: 文件增加333333333内容
9b7b4c2 (HEAD -> master) HEAD@{2}: commit: 文件增加22222222内容
0b0c94a HEAD@{3}: commit (initial): readme.txt提交

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#恢复到3333333版本
$ git reset --hard d93833d
HEAD is now at d93833d 文件增加333333333内容

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#第三行的3333333又恢复了
$ cat readme.txt
1111111111
2222222222
3333333333
4.深入理解
四个工作区
四个工作区
  • Workspace: 工作区,就是你在电脑上看到的目录,比如目录下study_git里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。
  • Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository: 仓库区(或版本库)就是study_git下的.git文件夹,这里面有你提交到所有版本的数据,其中版本库里面存了很多东西,其中最重要的就是stage/Index(暂存区)。其中HEAD指向最新放入仓库的版本,还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。
  • Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程

git的工作流程一般是这样的:

  1. 在工作目录中添加、修改文件;
  2. 将需要进行版本管理的文件放入暂存区域;
  3. 将暂存区域的文件提交到git仓库。
    因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
文件的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。


image.png
  • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
  • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
    下面图解释了四种状态的转变:
    image.png

    新建文件--->Untracked
    使用add命令将新建的文件加入到暂存区--->Staged
    使用commit命令将暂存区的文件提交到本地仓库--->Unmodified
    如果对Unmodified状态的文件进行修改---> modified
    如果对Unmodified状态的文件进行remove操作--->Untracked

我们前面说过使用Git提交文件到版本库有两步:
第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。
第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。

readme.txt 继续添加一行44444444,接着在目录下新建一个文件为test.txt 内容为test

$ 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: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 
#这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
        modified:   readme.txt

#Untracked:   未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test.txt

no changes added to commit (use "git add" and/or "git commit -a")

先使用git add 命令把2个文件都添加到暂存区中,再使用git status来查看下状态,如下:

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#多个文件可以使用 git add .
$ git add .

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt
        new file:   test.txt

使用git commit一次性提交到分支上,如下:

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -m '提交所有文件,包括新建的test.txt'
[master 88b90d1] 提交所有文件,包括新建的test.txt
 2 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 test.txt

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
nothing to commit, working tree clean
5.git撤销修改和删除文件
  • 撤销修改
    现在在readme.txt文件里面增加一行 内容为555555555555,在未提交之前,发现添加5555555555内容有误,所以我得马上恢复以前的版本,现在可以有如下几种方法可以做修改:
    第一:如果知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit。
    第二:可以按以前的方法直接恢复到上一个或者指定的版本。使用 git reset --hard 版本号
    这里说的是不使用以上两种方法,使用git checkout来操作
    先看下git 状态
$ 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.txt

no changes added to commit (use "git add" and/or "git commit -a")

其中git告诉你可以使用“git checkout--<file>…”放弃工作目录中的更改,用法如下:

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#把readme.txt文件在工作区做的修改全部撤销
$ git checkout -- readme.txt
#此处内容5555555已经没有了
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ cat readme.txt
1111111111
2222222222
3333333333
4444444444

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

  1. readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。
  2. 另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。

对于第二种情况,假如现在我对readme.txt添加一行 内容为6666666666,我git add 增加到暂存区后,接着添加内容7777777777,我想通过撤销命令让其回到暂存区后的状态。如下所示:

readme.txt 添加6666666666

#添加一条内容为6666666666
$ cat readme.txt
1111111111
2222222222
3333333333
4444444444
6666666666
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
# 添加到暂存区
$ git add readme.txt

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#接着添加内容7777777777,但是没有执行git add 添加到暂存区
$ cat readme.txt
1111111111
2222222222
3333333333
4444444444
6666666666
7777777777
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
# 直接使用撤销命令,把未添加到暂存区的内容撤销掉
$ git checkout -- readme.txt

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
# 最新文件 7777777777已经撤销掉不存在了
$ cat readme.txt
1111111111
2222222222
3333333333
4444444444
6666666666

注意:命令git checkout -- readme.txt 中的 -- 很重要,如果没有 -- 的话,那么命令变成创建分支了。

  • 删除文件
    版本库study_git目录添加一个文件b.txt,然后提交。如下:
#添加b.txt 到暂存区
$ git add b.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#提交b.txt
$ git commit -m '添加b.txt文件'
[master 910471f] 添加b.txt文件
 2 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 b.txt

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#删除b.txt
$ rm b.txt

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
#此时b.txt已经删除了,此时有两个选择
#1.直接commit
#2.从版本库中恢复
        deleted:    b.txt

no changes added to commit (use "git add" and/or "git commit -a")

如果想彻底从版本库中删掉了此文件的话,可以再执行commit命令.执行后如果在执行 git checkout -- b.txt 会报error: pathspec 'b.txt' did not match any file(s) known to git 错误

season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -a -m '删除b.txt'
[master 1349371] 删除b.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 b.txt

没有commit之前,如果想恢复此文件可以使用 git checkout -- b.txt

3.git小乌龟具体操作

2.8版本
64位官方下载
64位汉化包官方下载
因为图形化界面的操作比较简单,省去了很多步骤.不详细演示每个示例.

4. 如何使用远程仓库?

在了解之前,先注册码云(码云)账号,由于你的本地Git仓库和码云仓库之间的传输是通过SSH加密的,所以需要一点设置:

  1. 创建SSH Key。在用户主目录下(例如:C:\Users\season.ssh),看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:
ssh-keygen -t rsa –C “youremail@example.com”
  1. 第二步:登录码云,打开” 设置”中的SSH 公钥页面,添加公钥,填上任意title,在Key文本框里黏贴id_rsa.pub文件的内容。如下图:


    image.png
  2. 远程仓库
    远程仓库可以作为备份,又可以其他人通过该仓库来协作。
    若本地已开发的项目要推送到一个新创建的远程仓库,可以使用:

git remote add origin git@gitee.com:dongshixiao/study_git.git

来创建关联名称为origin的远程仓库,之后就可以正常地用git push和git pull推送了!

git remote -v   #查看已关联远程仓库信息
git remote add  #添加远程仓库  可以添加多个
git remote rm   #删除某个(如origin)
#如果关联多个 可以用关联名称来指定具体推送到哪个远程仓库
#如我又添加  git remote add php  git@gitee.com:dongshixiao/study_php.git
git push origin master   #推送到码云study_git仓库
git push php master    #推送到码云的study_php仓库

参考附录:

  1. https://www.liaoxuefeng.com/wiki/896043488029600
  2. https://zhuanlan.zhihu.com/p/30044692
  3. https://www.cnblogs.com/qdhxhz/p/9757390.html
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,050评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,538评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,673评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,622评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,047评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,974评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,129评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,893评论 0 209
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,654评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,828评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,297评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,619评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,326评论 3 243
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,176评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,975评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,118评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,909评论 2 278

推荐阅读更多精彩内容

  • tags: Hexo;Git;Githubcategories: 前端工具欢迎点击我的博客原文 从开始着手搭建博客...
    浅茉Sara阅读 1,390评论 11 13
  • 目录 语言无关类操作系统智能系统分布式系统编译原理函数式概念计算机图形学WEB服务器版本控制编辑器NoSQLPos...
    吴佳浩阅读 1,393评论 0 6
  • 鱼儿游了 鸟儿飞了 虫儿醒了 人儿走了
    知了知了知了阅读 162评论 0 0
  • 第十一章 他是我的 快下班的时候,柳丝丝的手机响了。她拿起手机一看,一串烂熟于心又让她厌恶至极的电话号码。她没有接...
    舒漓阅读 498评论 2 4
  • 终于回国了。深夜的亚的斯亚贝巴有些冷,我有些感冒,穿得厚实。 日子过得很快,我跟轶宝抱了又抱就拜拜了。 走的时候,...
    春野樱阅读 138评论 0 0