git常用命令
本文参考内容主要有:
1. https://gitee.com/all-about-git gitee
2. https://www.liaoxuefeng.com/wiki/896043488029600 来自廖雪峰老师的git教程
一、在看命令之前先来了解下git的工作原理 / 流程:
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
HEAD指向的版本就是当前版本;
二、git配置相关
1. 查看配置
(1) 在当前项目下面查看的配置是 全局配置 + 当前项目配置 , 使用时优先使用前项目配置;
$ git config --list
(2) 查看全局配置
$ git config --global --list
2. 设置全局用户名和邮箱
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的
Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
3. 配置单个仓库的用户名、邮箱,如果你不进行配置用户名和邮箱的话, 则会使用全局的。在当前项目下执行:
$ git config user.name "yourUserName"
$ git config user.email "github@xx.com"
三、版本库的创建、提交等基本操作
1. 创建版本库
$ git init
2. 将文件从工作区增加都index/stage(索引区/暂存区)
(1) 不带参数多个文件用空格隔开
$ git add [feile]
(2) 注意其中小数点,这条命令可以探测到新增、修改、删除,比较常用;
$ git add .
(3) 更新你已经跟踪的文件,其中u代表updata。如果添加了新文件,那么是不会主动跟踪的。
$ git add -u .
(4) git add -A . 包括了前两项
注意:将修改的文件add到暂存区后但是没提交到本地仓库,这时我又修改了工作区的该文件,
如果我需要将刚才修改的工作区的文件提交到本地仓库的话,那么我必须对该文件再次add到暂存区
即:每次修改,如果不用git add到暂存区,那就不会加入到commit中。
3. 将文件提交到本地版本库,其中-m后面输入的是本次提交的说明;
$ git commit -m "注释信息"
4. 将文件从暂存区移除,即从index/stage(暂存区)移除;
(1) 移除某个文件,多个文件时用逗号隔开;
$ git reset HEAD <file>
(2) 移除暂存区的所有文件;
$ git reset HEAD .
注意:将修改的文件add到暂存区后但是没提交到本地仓库,这时我又修改了工作区的该文件,
如果我需要将刚才修改的工作区的文件提交到本地仓库的话,那么我必须对该文件再次add到暂存区
即:每次修改,如果不用git add到暂存区,那就不会加入到commit中。
5. 更新 git pull
git pull = git fetch + git merge
6. git ftch -p 修剪本地分支
https://blog.csdn.net/LJFPHP/article/details/81741931
7、git fetch -a 获取远程仓库的所有分支更新,并把它们存放在本地的 fetch 目录下
具体来说,git fetch 命令用于从远程仓库获取最新的版本信息,而 -a 参数表示获取所有分支的更新。这个命令不会自动合并或更新任何本地分支,
它只是把远程仓库的所有更新下载到本地的 fetch 目录下。
四、git提交历史的查看
1. 查看提交历史,显示从最近到最远的提交日志
$ git log
commit 98bf5780459729112ff2c1a9f3bc420f3f9f84ea (HEAD -> master)
Author: “这里是显示的是提交人信息
Date: Sun Jun 7 18:31:25 2020 +0800
解读:其中98bf5780459729112ff2c1a9f3bc420f3f9f84ea,是commit的版本号,和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到
的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为
Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作
为版本号,那肯定就冲突了。每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可
视化工具查看Git历史,就可以更清楚地看到提交历史的时间线。
2. 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
$ git log --pretty=oneline
3. 带参数的git log也可以看到分支的合并情况:(git log --graph命令可以看到分支合并图)
$ git log --graph --pretty=oneline --abbrev-commit * cf810e4 (HEAD -> master) conflict fixed |\ | * 14096d0 (feature1) AND simple * | 5dc6824 & simple |/ * b17d20e branch test * d46f35e (origin/master) remove test.txt * b84166e add test.txt * 519219b git tracks changes * e43a48b understand how stage works * 1094adb append GPL * e475afc add distributed * eaadf4e wrote a readme file
4. 查看命令历史
$ git reflog
五、git差异化比较
1. 暂存区和工作区的比较
$ git diff
注意:比较的是当前分支的内容,输出的内容和参考博客:https://blog.csdn.net/weixin_37909391/article/details/84641899.
2. 比较暂存区和最近一次commit的差异
$ git diff --cached [file] 或者 git diff --staged [file]
3. 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
4. 显示两个分支之间的差异
$ git diff [first-branch]...[second-branch]
两个分支的差异,只显示名称和路径
$ git diff --name-only --ignore-space-change --ignore-all-space [origin/] 分支名 [origin/] 分支名
5. 查看工作区与本地远程仓库副本的差异,注意比较内容是以本地工作区为基准
$ git diff FETCH_HEAD
6. 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
7. 显示两次提交之间的差异,如果加上 --name-only,只显示名称和路径
$ git diff [first-branch]...[second-branch] --name-only
六、 git reset、git revert 相关的使用
(1) git reset 的使用
1. $ git reset HEAD [file]
回退到当前版本,也就是去除掉添加到暂存区的内容,因此git reset HEAD
操作只对暂存区起效果,多文件时可以$ git reset HEAD .(注意有个小数点)。
2. git reset commitNo(版本号)或者
回退到指定的版本号,这两个不加soft默认为soft,不影响工作区的;
3. git reset --hard commitNo
版本回退,直接把工作区的内容也修改了,慎用。需要注意的是使用版本回退后,git log是看不出
你回退到版本号之前的记录的,但你可以使用git reflog查看命令历史。
4. git reset --hard HEAD^,回退到上一个版本(即回退最近一次提交的内容);或者 git reset --hard HEAD^2,回到最近第二次提交的内容;
5. git reset [--soft] HEAD^,回退到最近一次提交;或者 git reset [--soft] HEAD^2,回到最近的第二次提交;
(2)git revert的使用
1. git revert commitNo
这条命令会把指定的提交的所有修改回滚,并同时生成一个新的提交。
2. git revert --no-commit commitNo,撤销commitNo的提交,但不提交,可以最后手动进行提交;
3. git revert --no-commit commitNo1..commitNo1,撤销commitNo和commitNo区间的提交(前开后闭),
但不提交,可以最后手动进行提交
注意:git revert时可能会出现冲突,这是需要手动解决后提交;
区别:git reset撤销时会清除之前的提交记录,而git revert不会清除原有的提交记录;
七、git checkout 的使用 $ git checkout -- file,文件在工作区的修改全部撤销,注意其中的 -- 很重要,没有 --,就变成了"切换到另一个分支"的命令;
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,
用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命
令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,可参考版本回退,不过前提是没有推
送到远程库。
八、远程仓库的关联、推送
1. 本地仓库与远程仓库关联,即关联一个远程库;
$ git remote add origin git@github.com:git用户名/远程仓库地址(或者使用ssh方式)
2. 向远程推送分支内容
$ git push -u origin master
注意:由于第一次的时候远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支
内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉
取时就可以简化命令,直接使用 git push就行了。
3. 从远程仓库克隆
$ git clone git@github.com:michaelliao/gitskills.git
九、分支管理
1. 创建分支
$ git branch newBranch,创建一个新分支newBranch
$ git checkout -b newBranch,创建并切换到分支newBranch
$ git switch -c newBranch,创建并切换到分支newBranch,这是个比较新的用法;
2. 本地分支和远程分支建立关系,最好本地分支和远程分支名称保持一致,如下;
* 查看本地分支与远程分支的映射关系:$ git branch -vv
* 撤销指定分支与远程分支的映射关系:$ git branch --unset-upstream [分支名]
* 撤销当前本地分支与远程分支的映射关系:$ git branch --unset-upstream
方式1:在本地创建和远程分支对应的分支:
$ git checkout -b branch-name origin/branch-name
方式2:建立本地分支和远程分支的关联:
$ git branch --set-upstream-to=origin/remoteBranch【远程分支名称】 remoteBranch【本地分支名称】
方式3:建立本地分支和远程分支的关联:
$ git push -u origin 远程分支名称
git push -u origin master 相当于 git push origin master 加 // 将远程仓库origin的master分支与本地仓库master分支关联 git branch --set-upstream-to=origin/master master
3. 查看分支
(1) git branch命令会列出本地仓库所有分支,当前分支前面会标一个*号,如下显示三个分支
$ git branch,
demo
master
* remoteBranch
(2) 查看所有分支,包括本地分支和远程分支
$ git branch -a
4. 切换分支
$ git checkout branchName,切换到分支branchName,注意撤销修改是git checkout -- file
$ git switch branchName,切换到分支branchName
5. 合并分支
(1)$ git merge <branchName>,合并指定分支(branchName)到当前分支;
(2)合并分支的模式:Fast forward,no-ff,squash,rebase详情见:
git merge和git merge --no-ff的区别
如:$ git merge --no-ff -m "描述内容" branchName;关闭fast-forward模式
6. 删除分支
$ git branch -d branchName,删除分支;
$ git branch -D branchName,强制删除分支;
7. 修改分支名称
$ git branch -m oldName newName;
git命令:
1. cherry-pick命令,让我们能复制一个特定的提交到当前分支:
常见问题:
1. git pull 时Please enter a commit message to explain why this
译文:请输入提交消息来解释为什么这种合并是必要的
解决方式:
git 在pull或者合并分支的时候有时会遇到这个界面。可以不管(直接下面3,4步),如果要输入解释的话就需要:
(1).按键盘字母 i 进入insert模式;
(2).修改最上面那行黄色合并信息,可以不修改;
(3).按键盘左上角"Esc";
(4).输入":wq",注意是冒号 + wq,按回车键即可.
其它:
1. git bash终端中,git commit、git status 乱码问题