页面正在赶来的路上……

Git学习笔记


Git学习笔记

一个可以学习git的在线游戏:Learn Git Branching

参考资料:

Git使用教程(超详细)

1. Git是什么

Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

2. Git安装(Windows)

  • 查看git版本信息

    git --version

  • git配置(在使用用Git工作之前,我们需要做个一次性的配置。方便后续Git能跟踪到谁做了修改,我们需 要设置对应的用户名与邮箱地址。)

git config --global user.name "your_username"
git config --global user.email [email protected]
git config --list 查看所有配置

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

3. Git文件的三种状态和工作模式

针对Git 文件的三种状态,Git项目有三个工作区域:工作区、暂存区和Git仓库。

基本的Git工作流程描述如下:

  • 在工作区中修改某些文件。

  • 对修改后的文件进行快照,然后添加到暂存区。

  • 提交更新,将保存在暂存区域的文件快照永久转储到 Git 仓库中。

4. 创建版本仓库并提交文件

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

4.1 初始化git仓库

 在本地文件自己指定位置,通过执行 git init 命令在本地初始化一个本地仓库,执行该命令后会在本地初始化一个 没有任何文件的空仓库。
  
 `git init`
  
 ps:<u>.git文件(本地仓库)是隐藏需要手动设置才能看到.git文件夹</u>

4.2 在.git 同级目录下添加git01.txt 文件后,使用 git status 查看工作目录与暂存区文件状态

 `git status 命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到 了, 哪些没有, 哪些文件没有被Git tracked(跟踪)到。`
  
 ![](https://bucket1-1319772612.cos.ap-shanghai.myqcloud.com/pic-notes%2Fgit%2F8.png)

4.3 执行 git add 文件名 命令添加文件到暂存区

 `git add path 通常是通过git add <path>的形式把<path>添加到索引库中,<path>可以是文件也可以是目录。`
  
 `git不仅能判断出<path>中,修改(不包括已删除)的文件,还能判断出新添的文件,并把它们的信息添加到索引库中。`
  
 ![](https://bucket1-1319772612.cos.ap-shanghai.myqcloud.com/pic-notes%2Fgit%2F9.png)
  
 > `git add` 就好比如您去超市购物,用购物车装了一大车的商品(类似于修改过的文件),然后去收银台结账,由于您一次性挑选的商品比较多,你有可能要犹豫一下到底要不要全部买下来;这时候,你可以一件件的将商品拿到收银员那里去扫码计价结算(类似与` git add fileA`, `git add fileB`…,即添加指定某些文件),也可以财大气粗的全部买下(类似于`git add .`/,即添加所有文件),接下来就是买单并拿回家(`git commit` 和 `git push`)。

4.4 提交文件到本地版本库(仓库)

 **文件被添加到暂存区后,执行 git commit 命令提交暂存区文件到本地版本库中。**
  
 `git commit 命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和 日志消息一起存储在新的提交中。通常在执行提交时 在 git commit 命令后跟上 -m 属性 加入本次提交的记录说明(注释)方便后续查看提交或改动记录。`
  
 `git commit -m "注释"`
  
 `git log`:用于显示提交日志信息

5. 常用操作

5.1 修改git01.txt

5.2 git status

此时当文件修改后 使用 git status 命令可以看到git 检测到文件被修改,git 版本库给出的下 一步操作是添加修改的文件到暂存区 此时执行添加操作命令

5.3 git status

执行提交

5.4 git log

git log 命令查看操作日志记录

5.5 git commit

执行提交操作

5.6 git diff

此时执行 git diff HEAD – git01.txt 与版本库内容进行比较结果如下:

  • 差异比较说明:

    ---:表示变动前的文件

    +++:表示变动后的文件

    变动的位置用两个@作为起首和结束

    @@ -1,2 +1,3 @@:减号表示第一个文件,"1"表示第1行,"2"表示连续2行。
    同样的,"+1,3"表示变动后,成为第二个文件从第1行开始的连续3行。
    

5.7 git reset

暂存区文件提交与撤销

①`git reset head``

git checkout @{-1}

当发现因失误而将文件添加到暂存区时,git 支持文件的撤销操作 执行命令git reset HEAD 文件 操作如下:

查看版本库状态并执行撤销操作

再次查看版本库状态 test.txt 成为未追踪文件(撤销成功)

6. 补充教程(复制粘贴)

git使用大全_git 使用

6.1 版本的创建于回归

1. 基础使用

git --help——查看git所有指令

git init——创建版本库

git add code.txt

git commit -m "版本1"——创建一个版本

git log——查看版本记录

git reset --hard HEAD~1git checkout @{-1}——回到上一个版本

HEAD表示当前最新版本

其中HEAD表示当前最新版本HEAD^表示当前版本的前一个版本、HEAD^^表示当前版本的前两个个版本;
也可以使用HEAD~1表示当前版本的前一个版本HEAD~100表示当前版本的前100版本。

git reset --hard 版本号(Hash值)——回到某个版本

git reflog——查看操作记录

2. 工作区和暂存区

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

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

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

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

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

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

  • 使用git status命令查看当前工作树的状态

    • 如果工作区和暂存区不一致时

    • 如果所有文件都被提交到了版本库

3. 撤销修改

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file

  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作

4. 对比工作区文件与HEAD版本中文件的不同

(HEAD表示当前.git库中的最新版本)

git diff HEAD -- code.txt

① 查看工作区和暂存区之间文件的差异

git diff 命令,默认查看的就是 工作区 和 暂存区之间文件的差异

1.git diff : 查看工作区和暂存区之间所有的文件差异
2.git diff -- 文件名:查看具体某个文件 在工作区和暂存区之间的差异
3.git diff -- 文件名1 文件名2 文件名3:查看多个文件在工作区和暂存区之间的差异【注意】:查看具体文件的时候 – 和文件名 之间有一个 空格,文件名1 和 文件名2 和 文件名3之间也有空格

1.初始条件:工作区,暂存区之间保持干净一致的状态

2.修改工作区中的文件

3.git diff -- 文件名1 文件名2 查看文件的差异

4.扩展:将工作区中修改的文件添加到暂存区后再比较差异情况

② 查看工作区和版本库之间文件的差异

git diff HEAD : 查看工作区与最新版本库之间的所有的文件差异
git diff 具体某个版本 : 查看工作区与具体某个提交版本之间的所有的文件差异
git diff HEAD -- 文件名 : 查看工作区与最新版本库之间的 指定文件名的文件差异
git diff HEAD -- 文件名1 文件名2 文件名3 :查看工作区与最新版本库之间的 指定文件名的多个文件差异
git diff 具体某个版本 -- 文件名 : 查看工作区与具体某个版本之间的 指定文件名的文件差异
git diff 具体某个版本 -- 文件名1 文件名2 文件名3 :查看工作区与最具体某个版本之间的 指定文件名的多个文件差异

1.初始条件:

9f5a54b版本只新增了五个文件:a.txt、 b.txt 、c.txt 、d.txt、 e.txt
da27f42 版本修改了 a.txt 和 b.txt 两个文件
当前工作区、暂存区、版本库状态一致

2.再修改一下 a.txt 文件内容

3.查看当前工作区 和 9f5a54b版本直接的文件差异

③情景三:查看暂存区和版本库之间文件的差异

》官方文档写的就非常的好!

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…​]

This form is to view the changes you staged for the next commit relative to the named .
Typically you would want comparison with the latest commit, so if you do not give , it defaults to HEAD.
If HEAD does not exist (e.g. unborn branches) and is not given, it shows all staged changes.
–staged is a synonym of --cached.

》 下面是我自己的译文:此命令 用于查看 暂存区中和 指定提交 之间的文件差异。特别指出:你可能最想比较暂存区与上一次提交之间的区别,所以,如果你不明确指定 提交的版本号,则默认是HEAD.
如果 HEAD 和 指定版本号都不存在,则该命令会展示暂存区中所有的修改。
–staged 参数和 --cached 参数是一致的。

git diff --cached : 查看暂存区和 上一次提交 的最新版本(HEAD)之间的所有文件差异
git diff --cached 版本号 : 查看暂存区和 指定版本 之间的所有文件差异
git diff --cached – 文件名1 文件名2 文件名3
: 查看暂存区和 HEAD 之间的指定文件差异
git diff --cached 版本号 – 文件名1 文件名2 文件名3 : 查看暂存区和 指定版本 之间的指定文件差异1

1.初始条件:

9f5a54b版本只新增了五个文件:a.txt、 b.txt 、c.txt 、d.txt、 e.txt
da27f42 版本修改了 a.txt 和 b.txt 两个文件
f0c63af 版本修改了 a.txt 文件
当前工作区、暂存区、版本库状态一致

2.修改文件,并添加到暂存区

3.查看暂存区与上个提交版本之间的区别

4.查看暂存区与具体某个版本之间的区别

④ 查看不同版本库之间文件的差异

git diff 版本号1 版本号2 : 查看两个版本之间的差异
git diff 版本号1 版本号2 -- 文件名1 文件名2 : 查看两个版本之间的指定文件之间的差异
git diff 版本号1 版本号2 --stat : 查看两个版本之间的改动的文件列表
git diff 版本号1 版本号2 src : 查看两个版本之间的文件夹 src 的差异

1.查看当前的版本列表

2.查看两个版本之间的差异

5. 删除文件

  • git rm code.txt

  • 命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容

6.2 分支管理

1. 创建和合并分支

  • git把我们之前每次提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前只有一条时间线,在git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支

  • 一开始的时候,master分支是一条线,git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

    • git创建一个分支很快,因为除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化。

  • 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

  • 假如我们在dev上的工作完成了,就可以把dev合并到master上。git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

    git合并分支也很快,就改改指针,工作区内容也不变。

  • 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

2. 创建和合并分支举例

  • 执行如下命令可以查看当前有几个分支并且看到在哪个分支下工作

    git branch

  • 创建一个分支dev并切换到其上进行工作

    git checkout -b dev

  • 修改code.txt内容,在里面添加一行,并进行提交

  • 切换回master分支

    git checkout master

    查看code.txt,发现添加的内容没有了。因为那个提交是在dev分支上,而master分支此刻的提交点并没有变

  • 把dev分支的工作成果合并到master分支上

    git merge 分支名称

    再查看code.txt的内容,就可以看到,和dev分支的最新提交是完全一样的

    注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快

  • 合并完成后,就可以放心地删除dev分支了,删除后,查看branch,就只剩下master分支了

总结:

查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d

3. 解决冲突

  • master分支和dev分支各自都分别有新的提交:

  • 执行如下命令尝试将dev分支合并到master分支上来

  • git status也可以告诉我们冲突的文件

  • 查看code.txt的内容

    cat <文件名>

  • git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存

  • 再提交

  • 现在,master分支和dev分支变成了下图所示

  • 用带参数的git log也可以看到分支的合并情况

4. 分支管理策略

通常,合并分支时,如果可能,git会用fast forward模式

但是有些快速合并不能成功而且合并时没有冲突,这个时候会合并之后并做一次新的提交

但这种模式下,删除分支后,会丢掉分支信息

  • 创建切换到dev分支下;

  • 新建一个文件code3.txt编辑内容,并提交一个commit;

  • 切换回master分支,编辑code.txt并进行一个提交;

  • 合并dev分支的内容到master分支;

  • 出现如下提示,这是因为这次不能进行快速合并,所以git提示输入合并说明信息,输入合并内容之后git会自动创建一次新的提交

  • 如果要强制禁用fast forward模式,git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息

  • 创建并切换到dev分支;

  • 修改code.txt内容,并提交一个commit;

  • 切换回master分支;

  • 准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward;

    因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去

  • 合并后,我们用git log看看分支历史

5. bug分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除

  • 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,恢复工作现场

6.3 使用github

1. 创建仓库

  • 注册github账户,登录后,点击"New respository "

  • 在新页面中,输入项目的名称,勾选’readme.md’,点击’create repository’

  • 添加成功后,转到文件列表页面

2. 添加ssh账户

  • 点击账户头像后的下拉三角,选择’settings’(如果某台机器需要与github上的仓库交互,那么就要把这台机器的ssh公钥添加到这个github账户上);

  • 点击’SSH and GPG keys’,添加ssh公钥。

  • 编辑文件.gitconfig,修改某台机器的git配置

  • 修改为注册github时的邮箱,填写用户名

  • 使用如下命令生成ssh密钥 ssh-keygen -t rsa -C "邮箱地址"

  • 进入主目录下的.ssh文件件,下面有两个文件

     公钥为id_rsa.pub
     私钥为id_rsa
    
  • 查看并复制公钥内容

  • 回到浏览器中,填写标题,粘贴公钥

3. 克隆项目

  • 复制git地址

4. 推送项目

  • 推送分支,就是把该分支上的所有本地提交推送到远程库,推送时要指定本地分支,这样,git就会把该分支推送到远程库对应的远程分支上

git push origin 分支名称
例:
git push origin smart

git第一次提交出现fatal: No configured push destination. Either specify the URL from the command-line or

1. 需要在 git push 之前需要输入 git remote add origin “远程仓库地址”

git remote add origin https://gitee.com/liujianzhuang/js-basics.git

2. git push -u origin 对应远程分支名

git push -u origin master

3. 接下来就可以直接一套操作了

git add .
git commit -m "信息"
git push

5. 将本地分支跟踪服务器分支

git branch --set-upstream-to=origin/远程分支名称 本地分支名称
例:
git branch --set-upstream-to=origin/smart smart

6. 从远程分支上拉去代码

git pull orgin 分支名称
例:
git pull orgin smart


文章作者: Z
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Z !
评论
//
  目录