Bootstrap

git 学习

安装:

1.git 本身:

  到git 官网下载一个git.   Git   如windows 版 的 Git-2.30.0.2-64-bit.exe 

2. 安装界面图形显示的客户端tortoisegit 如 TortoiseGit-2.11.0.0-64bit.msi  Download – TortoiseGit – Windows Shell Interface to Git

初始化一个Git仓库,使用git init命令。可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的

添加文件到Git仓库,分两步:

  1. 使用命令git add <file>,注意,可反复多次使用,添加多个文件;
  2. 使用命令git commit -m <message>,完成。 如:
    git commit -m "append GPL"

git add <file> 后

git-stage

git commit -m ""后:

如果想更改一次提交,使用 git commit --amend。git会使用与当前提交相同的父节点进行一次新提交,旧的提交会被取消。

git-stage-after-commit

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

  1. 工作区:就是你在电脑里能看到的目录。
  2. 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  3. 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

已经在仓库的文件,修改后,需要使用git add 把修改的地方添加暂存区,再使用git commit 提交。

版本回退

git log  命令:显示从最近到最远的提交日志

git log --pretty=oneline

git reset命令 :版本回退用 可用参数  -hard

git reset --hard HEAD^

在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。 

应该是推送一次算一个版本。

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

先用git status查看一下状态:

提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别:

多次修改的话:

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

git checkout -- file

可以丢弃工作区的修改:即覆盖工作区的修改,revert。

$ git checkout -- readme.txt

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

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

git reset HEAD <file> 

可以把暂存区的修改撤销掉(unstage),重新放回工作区:即实际上就是取消add 操作

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

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

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

删除文件:

确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

远程库操作

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

远程库的名字就是origin。当前分支:master

git push origin master

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

Git支持多种协议,包括https,但ssh协议速度最快。

  • 查看远程库信息,使用git remote -v

  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;

  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

分支

Git鼓励大量使用分支:

查看分支:git branch   当前分支前面会标一个*号。

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

  3. 如果合并有冲突,则解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

Git基本常用命令如下:
   mkdir:         XX (创建一个空目录 XX指目录名)
   pwd:          显示当前目录的路径。
   git init :         把当前的目录变成可以管理的git仓库,生成隐藏.git文件。
   git add XX :      把xx文件添加到暂存区去。
   git commit -m “XX” : 提交文件 –m 后面的是注释。
   git status:        查看仓库状态
   git diff  XX :     查看XX文件修改了那些内容
   git log :         查看历史记录
   git reset  --hard HEAD^ :或者 git reset  --hard HEAD~ 回退到上一个版本
                        (如果想回退到100个版本,使用git reset --hard HEAD~100 )
   cat XX   :      查看XX文件内容
   git reflog  :     查看历史记录的版本号id
   git checkout -- XX : 把XX文件在工作区的修改全部撤销。
   git rm XX  :        删除XX文件
   git remote add origin https://github.com/RTplay/testgit.git: 关联一个远程库
   git push -u(第一次要用-u 以后不需要) origin master :把当前master分支推送到远程库
   git clone https://github.com/RTplay/testgit.git : 从远程库中克隆
   git checkout -b dev : 创建dev分支 并切换到dev分支上
   git branch  :查看当前所有的分支
   git checkout master :切换回master分支
   git merge dev    :在当前的分支上合并dev分支
   git branch -d dev :删除dev分支
   git branch name  :创建分支
   git stash :把当前的工作隐藏起来 等以后恢复现场后继续工作
   git stash list :查看所有被隐藏的文件列表
   git stash apply :恢复被隐藏的文件,但是内容不删除
   git stash drop: 删除文件
   git stash pop: 恢复文件的同时 也删除文件
   git remote: 查看远程库的信息
   git remote -v :查看远程库的详细信息
   git push origin master  :Git会把master分支推送到远程库对应的远程分支上

  • git add files 把当前文件放入暂存区域。
  • git commit 给暂存区域生成快照并提交
  • git commit files 进行一次包含最后一次提交加上工作目录中文件快照的提交。并且文件被添加到暂存区域。相当于是git add files + git commit 组合(前提条件是files曾经加入到暂存区)
  • git commit -a 相当于运行 git add 把所有当前目录下的文件加入暂存区域再运行。git commit.   (前提条件是当前目录下的文件曾经加入到暂存区)

 git merge dev  :在当前的分支上合并dev分支

如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。 另一种情况是如果当前提交是另一个分支的祖父节点,就导致fast-forward合并。指向只是简单的移动,并生成一个新的提交。

结果是先保存当前目录和索引,然后和父节点一起做一次新提交。最后看情况,删除原先的分支。

1. git add 添加 多余文件
这样的错误是由于, 有的时候 可能

git add . (空格+ 点) 表示当前目录所有文件,不小心就会提交其他文件

git add 如果添加了错误的文件的话

撤销操作

git status     先看一下add 中的文件
git reset HEAD   如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 ,HEAD 可以不写,直接git reset 
git reset HEAD XXX/XXX/XXX.java    就是对某个文件进行撤销了,HEAD 可以不写,直接git reset  XX文件

2. git commit 错误

如果不小心 弄错了 git add后 , 又 git commit 了。
先使用
git log 查看节点
commit xxxxxxxxxxxxxxxxxxxxxxxxxx
Merge:
Author:
Date:

然后
git reset commit_id

over

PS:还没有 push 也就是 repo upload 的时候

git reset commit_id (回退到上一个 提交的节点 代码还是原来你修改的)
git reset –hard commit_id (回退到上一个commit节点, 代码也发生了改变,变成上一次的)

3.如果要是 提交了以后,可以使用 git revert(反做)

还原已经提交的修改
此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交
git revert HEAD 撤销前一次 commit
git revert HEAD^ 撤销前前一次 commit
git revert commit-id (撤销指定的版本,撤销也会作为一次提交进行保存)
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。

重点理解

git reset 

git checkout

git revert

git reset 

1.git reset -- files 用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件。

清空add命令向暂存区提交的关于file文件的修改(Ustage),这个命令仅改变暂存区,并不改变工作区. 实际上就是取消add 操作

2.  git  reset  版本号 

     a. git  reset --hard  版本号  :重置stage区和工作目录:

      reset --hard 会在重置 HEAD 和branch的同时,重置stage区和工作目录里的内容。

     b. git  reset --hard  版本号 
       reset --soft:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区

    c. git  reset   版本号 

    reset 不加参数(mixed):保留工作目录,并清空暂存区

reset 的本质:移动 HEAD 以及它所指向的 branch

实质上,reset 这个指令虽然可以用来撤销 commit ,但它的实质行为并不是撤销,而是移动 HEAD ,并且「捎带」上 HEAD 所指向的 branch(如果有的话)。也就是说,reset 这个指令的行为其实和它的字面意思 "reset"(重置)十分相符:它是用来重置 HEAD 以及它所指向的 branch 的位置的。

如果没有给出提交点的版本号,那么默认用HEAD。这样,分支指向不变,但是索引会回滚到最后一次提交

git checkout

checkout命令用于从历史提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支。

1.git checkout -- files  当给定某个文件名,git会从指定的提交中拷贝文件到暂存区域和工作目录。如果命令中没有指定提交节点,则会从暂存区域中拷贝内容到工作目录,用来丢弃本地修改。这个命令改变的是工作区。实际上就是revert

       如果是HEAD, 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。

      如果是HEAD~ git checkout HEAD~ foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c复制到工作目录并且加到暂存区域中.

2. git checkout 分支 

  当不指定文件名,而是给出一个(本地)分支时,那么HEAD标识会移动到那个分支(也就是说,我们“切换”到那个分支了),然后暂存区域和工作目录中的内容会和HEAD对应的提交节点一致。新提交节点(下图中的a47c3)中的所有文件都会被复制(到暂存区域和工作目录中);只存在于老的提交节点(ed489)中的文件会被删除。不属于上述两者的文件会被忽略,不受影响。

3.如果既没有指定文件名,也没有指定分支名,而是一个标签、远程分支、SHA-1值或者是像main~3类似的东西,就得到一个匿名分支,称作detached HEAD(被分离的HEAD标识)。

git revert

git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程就使用git revert

git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西.

步骤:使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交:
(1)反做,使用“git revert -n 版本号”命令。如下命令,我们反做版本号为8b89621的版本:

git revert -n 8b89621019c9adc6fc4d242cd41daeb13aeb9861
注意: 这里可能会出现冲突,那么需要手动修改冲突的文件。而且要git add 文件名。
(2)提交,使用“git commit -m 版本名”,如:

git commit -m "revert add text.txt" 
 

查看当前用户名和邮箱

1 git config user.name
2 git config user.email
修改
git config --global user.name "test(新的用户名)"
git config --global user.email "[email protected](新的邮箱)"



假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
git fetch origin
git reset --hard origin/master

;