安装:
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仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。 如:git commit -m "append GPL"
git add <file> 后
git commit -m ""后:
如果想更改一次提交,使用 git commit --amend
。git会使用与当前提交相同的父节点进行一次新提交,旧的提交会被取消。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .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 commit
或git 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>
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin <branch-name>
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
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 "abc@qq.com(新的邮箱)"
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:git fetch origin
git reset --hard origin/master