一文搞懂git常用命令

git命令详解
git管理的项目每个文件有三种状态
1.文件存在于工作区
2.文件已经添加到暂存区中
3.文件已经提交到git本地仓库中

git init :在一个空的目录中,初始化一个空的git本地仓库。
git init -bare :在一个空的目录中,初始化一个空的裸库。
git add 文件名 :把一个工作文件加入到暂存区中。
git add . :提交当前目录的所有已修改文件到暂存区中。
git commit -m “commit message” :提交一个目录的所有文件到本地git仓库中
git commit -am ‘commit message’ 把文件提交到暂存区并且提交到本地仓库中。
git restore --staged 文件名  :把一个操作从暂存区退回
git reset HEAD 文件名:把一个操作从暂存区退回
git restore 文件名 :把一个文件修改操作从本地目录退回到暂存区的状态
git checkout -- 文件名:把一个文件修改操作从本地目录退回到暂存区的状态
git rm 文件名 :删除一个git本地仓库中存在的文件
git rm --cached 文件名:删除暂存区中的文件
git mv 旧文件名 新文件名 :修改一个git本地仓库中存在的文件名
git log :显示提交的详细日志
git log -n :显示提交日志的最近n行
git reflog :显示操作日志
git log --graph:以图形化格式显示提交日志
git log --graph --abbrev-commit:以图形化格式简化显示提交日志
git log --graph --pretty=oneline --abbrev-commit :以图形化格式简化显示提交日志
git status :当前目录具体的状态
git config --local user.name xxx   修改当前主机的默认提交用户
git config --local user.email [email protected] 修改当前主机的默认提交用户地址
git config --system user.name xxx
git config --system user.email [email protected]
git config --global user.name xxx
git config --global user.email [email protected]
git commit --amend --reset-author :修改提交人信息
删除文件
一、当文件存在于工作区中,可以直接通过rm命令删除,这样删除之后就不能恢复了
二、当文件已经添加到暂存区中,可以通过[git restore --staged 文件名]命令把文件从暂存区中退回,然后使用rm命令删除
三、当文件已经提交到git本地仓库中,
  1、使用[git rm 文件名]命令删除文件后,如果确定删除的话可以通过[git commit -m “确定删除”]命令把这次删除的操作提交到git本地仓库中,如果后续觉得不需要删除的话使用[git restore --staged 文件名]命令把删除的操作从暂存区退回,并且使用[git restore 文件名]命令把删除的操作从本地目录退回,这样删除的文件就回来了
  2、使用[rm 文件名]命令删除文件后,如果确定删除的话可以通过[git add 文件名]以及[git commit -m "删除提交"]命令把这次删除的操作提交到git本地仓库中,如果后续觉得不需要删除的话使用[git restore 旧文件名]命令把本地目录删除的文件恢复过来就可以了。
修改文件名
一、当文件存在于工作区中,可以直接通过mv命令修改。
二、当文件已经添加到暂存区中,可以通过[git restore --staged 文件名]命令把文件从暂存区中退回,然后使用mv命名修改
三、当文件已经提交到git本地仓库中,
  1、使用[git mv 旧文件名 新文件名]命令修改文件名后,如果确定修改文件名的话可以通过[git commit -m     “确定修改”]命令把这次修改的操作提交到git本地仓库中,如果后续觉得不需要修改的话使用[git  restore --staged 新文件名]命令把修改的操作从暂存区退回,由于git mv重命名是先创建一个以新文件名命名的文件,在删除那个旧文件命名的文件,所以需要使用[git  restore --staged 旧文件名]命令把删除的文件操作也从暂存区退回,然后使用[git restore 旧文件名]命令把删除旧文件的操作从本地目录退回,这样修改的文件就回来了,最后删除本地目录新文件名的文件。
  2、使用[mv 旧文件名 新文件名]命令修改文件名后,如果确定修改文件名的话可以通过[git add 旧文件名]和[git add 新文件名]以及[git commit -m “确定修改”]命令把这次修改的操作提交到git本地仓库中,如果后续觉得不需要修改的话,直接通过[mv 新文件名 旧文件名]改回来即可。
  
.gitignore文件详解:这个文件中的内容是在对某些不需要进行版本控制的文件的过滤:
*.a :忽略所有.a结尾的文件
!lib.a :但lib.a除外
/TODO :忽略项目根目录下的TODO文件,不包括其他目录的文件
build/ :忽略build/目录下的所有文件
doc/*.txt 忽略doc目录下的以txt结尾的文件。
doc/*/*.txt:忽略doc目录下的下一层目录以txt结尾的文件。
doc/**/*.txt:忽略doc目录下所有的以txt结尾的文件。

分支命令
git branch :查询当前项目的所有分支
git branch 分支名 :创建一个新的分支
git branch -d 分支名:删除已经合并过的分支
git branch -D 分支名:强制删除某一个分支
git branch -m 旧分支名 新分支名:修改分支名
git branch -M 新分支名:把当前的分支名修改为新分支名
git checkout 分支名:切换分支
git checkout -b 分支名:创建一个分支并且切换到这个新创建的分支上。
git switch -c 分支名:创建一个分支并且切换到这个新创建的分支上。
git merge 分支名:把分支名合并到当前分支下。
git merge --no-ff 分支名:把分支名合并到当前分支下,禁止使用Fast-forward模式
git reset --hard HEAD^ :git回退到上一个版本
git reset --hard HEAD^^ :git回退两个版本
git reset --hard 提交id:git回退到指定版本号的版本,版本号可以通过git reflog进行查询
git checkout 提交id: 检出当前版本号的代码,并把HEAD指向当前的版本号,这个HEAD是游离的
git stash:当两个分支的最新版本号不同时,在一个分支上修改工作区的文件后,不能立马切换到另一个分支,这个时候可以通过[git stash]命令暂时保存工作现场。
git stash save 'message' :暂时保存工作现场,并附说明
git stash list :列表展示出当前分支所有暂时保存的工作现场。
git stash pop:恢复之前保存的工作现场,并把之前保存的工作现场记录删除掉。
git stash apply:恢复之前保存的工作现场,但是不删除之前保存的工作现场记录。
git stash drop stash@{0}:手动删除之前保存的工作现场记录。
git stash apply stash@{0}:恢复指定保存的工作现场记录。
解决合并冲突
[git merge 分支名]后如果出现合并冲突,则需要手动解决冲突,然后使用[git add 文件名]命令,这里的[git add]命令不是把文件提交到暂存区中,这个的作用是标记已经解决冲突。然后使用[git commit]命令结束合并,

标签

标签分为轻量级标签和带有附注的标签
git tag 标签名:当项目达到某个里程碑可以通过创建轻量级标签的方式保存版本。
git tag -a 标签名 -m ‘message’ :当项目达到某个里程碑可以通过创建带有附注标签的方式保存版本。
git tag -d 标签名:删除本地标签
git tag :查看当前所有的标签信息
git tag -l ‘标签名’:查找指定的标签信息,标签名支持正则。
git show tagName:查看具体某个标签的信息
git push origin tagName:推送本地仓库某个标签到远程仓库中。
git push origin tagName tagName:推送多个本地仓库的标签到远程仓库中。
git push origin --tags :推送所有远程仓库不存在的标签到远程仓库中。
git push origin :refs/tags/tagName:删除远程仓库的tagName标签
git push origin --delete tag tagName :删除远程仓库的tagName标签。
git push origin refs/tags/tagName1:refs/tags/tagName2:推送本地标签到远程仓库的完成写法,支持本地标签和远程标签的标签名不同。
git fetch origin tag tagName:只从远程仓库拉取标签名为tagName的标签

git blame 文件名:输出文件所有的修改人,修改时间以及提交id

diff比较
git diff :比较工作区和暂存区的文件差别,暂存区的文件为原始文件,工作区的文件为目标文件

diff --git a/2.txt b/2.txt
index c425c37..187b90c 100644
--- a/2.txt
+++ b/2.txt
@@ -1,2 +1,3 @@
 123
 234
+345
---:代表原始文件;+++:代表目标文件
git diff HEAD:比较工作区和本地库最新提交的文件差别,本地库的文件为原始文件,工作区的文件为目标文件。

diff --git a/2.txt b/2.txt
index c425c37..187b90c 100644
--- a/2.txt
+++ b/2.txt
@@ -1,2 +1,3 @@
 123
 234
+345
---:代表原始文件;+++:代表目标文件
git diff 提交id:比较工作区和本地库指定提交id的文件差别
git diff --cached :比较暂存区和本地库最新提交的文件差别,本地库的文件为原始文件,暂存区的文件为目标文件

diff --git a/2.txt b/2.txt
index c425c37..187b90c 100644
--- a/2.txt
+++ b/2.txt
@@ -1,2 +1,3 @@
 123
 234
+345
---:代表原始文件;+++:代表目标文件
git diff --cached 提交id:比较暂存区和本地库指定提交id的文件差别

命令别名
git config --global alias.br branch :把git branch 设置别名为git br。
git config --global alias.ui '!gitk':当要设置的别名不是git命令时,要在别名之前加上!。
git config --global alias.cm 'commit -m' :当要设置别名的命令是多个单词组合的时候,要加上‘’。

远程操作
在使用远程操作的时候我们使用ssh协议进行访问,这样不用每次都输入用户名密码,不过需要把本地生成的公钥放在github上面,操作步骤:
1. 先在本地生成公钥,在git的bash命令窗口输入ssh-keygen生成公钥和私钥,然后打开私钥的文件,文件位置为:C:\Users\...\.ssh\id_rsa.pub,复制里面的内容放在github上面就可以了。

git remote add origin https://github.com/... :把本地库的项目推送到远程的一个空的仓库中,[git remote]: 远程操作. origin:相当于https://github.com/...的别名

git remote rename origin origin2 : 修改远程仓库的别名

git remote rm origin : 删除远程仓库

git remote show :展示当前本地库关联的所有远程库信息,一个本地库可以关联多个远程库

git remote show origin:展示某个远程库的具体信息,origin为远程库的别名

git push -u origin branchName :把本地仓库的branchName分支和远程仓库branchName分支相关联。

git push --set-upstream origin branchName :等价于git push -u origin branchName 把本地仓库的branchName分支和远程仓库的branchName分支相关联

git push --set-upstream origin branchName:branchName :完整写法,远程分支和本地分支的分支名可以不同,不同的话就不能使用git push 简写命令来进行远程提交,只能通过git 
push的完整命令来进行操作,也可以通过git push origin newBranchName在远程仓库创建一个本地的同名仓库来进行推送。

git push origin :branchName :删除远程的branchName分支,把一个空的本地分支推送到远程仓库中。

git push origin --delete branchName:等价于git push origin :branchName,删除远程的branchName分支

git push origin src:dest :src为本地分支,dest为远程分支,这是个git push 命令的完整写法

git pull origin src:dest : src为远程分支,dest为本地分支,这是git pull命令的完整写法。git pull可以拉取远程仓库的所有东西,包括远程仓库的分支、标签、项目文件等等。

git push origin HEAD:branchName :推送当前HEAD指向的分支的最新提交到branchName远程分支上。

git branch -a :查看所有分支包括远程的跟踪分支。

git clone https://github.com/... :拉取远程分支上的项目文件

git clone https://github.com/... 目录名:拉取远程分支上的项目文件,并且以目录名作为项目名称。

git checkout -b branchName origin/branchName:当从远程克隆代码后,因为远程有多个分支,在克隆的时候也会把这些远程分支的映射分支也克隆到本地,但是本地没有对应的分支所以需要
以本地的远程镜像分支为基准创建一个新的分支branchName并切换到branchName分支上。


git checkout --track origin/branchName:等价于git checkout -b branchName origin/branchName,以本地的远程镜像分支为基准创建一个新的分支branchName并切换到branchName分支上。
新的分支名和远程develop分支相同。

git remote prune origin :裁剪掉游离的远程分支

git branch --unset-upstream:修复本地分支和远程分支之间的映射关系。

重命名远程分支的话需要先删除远程分支,在推送一个不同的分支名到远程仓库

当远程分支被[git push origin --delete branchName]命令删除之后,工程的其他协作人员可以使用[git remote show origin]命令查看远程分支的情况,如果发现有映射远程分支处于游离状态,可以使用[git remote prune origin]命令把游离的远程分支裁减掉。

git fetch origin branchName:refs/remotes/origin/newBranchName:拉取远程仓库的branchName分支到本地,并且在本地创建一个newBranchName镜像分支与之映射。

HEAD标记:HEAD文件是一个指向你当前所在分支的引用标识符,该文件内部并不包含SHA-1值,而是一个指向另外一个引用的指针。
当使用git commit 命令时,git会创建一个commit对象,并且将这个commit对象的parent指针设置为HEAD所指向的引用的SHA-1值,
我们对于HEAD修改的任何操作,都会被git reflog完整记录下来。
在缺省情况下,refspac会被git remote add 命令所自动生成,git会获取远端上refs/heads下的所有引用,并将它们写到本地的refs/remotes/origin目录下,所以远端上有一个master分支,你在
本地可以通过下面几种方式来访问它们的历史记录。
git log origin/master
git log remotes/origin/master
git log refs/remotes/origin/master

submodule:子模块,当你的项目需要引入一个经常发生版本变化的其他项目时,可以通过submodule进行关联
git submodule add http://github.com/... subModuleName :在主项目中引入你需要引入的子项目,并且把子项目存放在subModuleName目录中,这个目录不能事先存在。[git submodule add]:引入一个子模块,subModuleName:子模块的名称
拉取子模块的代码:
1. 在子模块的目录中使用[git pull]命令拉取 
2. 在主目录中使用 [git submodule foreach git pull]命令可以一次拉取所有的子模块的代码到本地主项目中。
带有子模块的项目克隆:
1. git clone http://github.com/主项目... 项目名,然后在主项目中执行git submodule init 初始化子模块,最后执行git submodule update --recursive命令就可以把主项目和子模块都克隆完成。
2. git clone http://github.com/... projectName --recursive:克隆带有submodule子模块的项目。

删除子模块 没有具体的删除子模块的命令,只能如下操作。
git rm --cached submoduleName
rm -rf submoduleName
rm .gitmodules
rm -rf .git/modules
git add .
git commit 
git push


subtree :子模块;和submodule的区别时,submodule如果在主项目要修改子模块的代码,提交会出现一些不可预测的问题,subtree可以在主项目提交子模块的代码
git remote add subtree-origin http://github.com/... :新增一个子模块的远程版本库
git subtree add --prefix=subtreeName subtree-origin master --squash :把子模块的远程代码拉取到subtreeName目录中
git subtree add --prefix subtreeName subtree-origin master --squash:把子模块的远程代码拉取到subtreeName目录中
git subtree add -P subtreeName subtree-origin master --squash :把子模块的远程代码拉取到subtreeName目录中
git subtree pull --prefix=subtreeName subtree-origin master --squash :拉取子模块的远程代码到subtreeName目录中
git subtree pull --prefix subtreeName subtree-origin master --squash:拉取子模块的远程代码到subtreeName目录中
git subtree pull -P subtreeName subtree-origin master --squash:拉取子模块的远程代码到subtreeName目录中
git subtree push --prefix=subtreeName subtree-origin master :提交子模块的修改代码到子模块的远程版本库中
git subtree push -P subtreeName subtree-origin master:提交子模块的修改代码到子模块的远程版本库中
git subtree push --prefix subtreeName subtree-origin master:提交子模块的修改代码到子模块的远程版本库中
--squash:加上这个参数会把子模块的提交合并为一个提交merge到当前目录中。项目开始时候如果加上--squash这个参数,之后的所有针对git subtree pull命令都要加上--squash,如果没加的话,
后面所有git subtree pull都不要加这个参数,不然会出现一些不容易解决的问题。


git cherry-pick 提交ID:在项目中如果出现应该提交到master分支的代码结果提交到其他分支了,可以在master分支下执行这个命令把提交到其他分支的代码重新拉取到master分支,最后在把其他分支恢复到之前的情况。
git gc :这个命令执行后会优化.git文件夹中的内容,把一些该合并的文件进行合并,优化磁盘空间。

rebase
rebase的功能和merge的功能是类似的,但是rebase的执行效果和merge是完全不一样的,rebase在执行过程中是会修改提交日志的,并且执行完rebase一个分支的日志提交点是一条直线的,不会出现分叉
rebase最好的使用场景是本地的和远程没有映射关系的分支。
git rebase branchName :把branchName合并到当前分支上。
git rebase --continue: 在rebase过程中如果出现冲突先使用git add 标记解决完冲突,然后使用git rebase --continue
git rebase --abort :任何时候都可以通过这条命令终止rebase ,分支会恢复到rebase开始之前的状态。
git rebase --skip :丢掉当前分支的修改,使用git rebase branchName命令中branchName分支的修改。

你可能感兴趣的:(其他工具,git)