常见Git命令示例
题记
众所周知,当前互联网开发代码、分支管理工具大多采用
Git
或SVN
,且Git
使用的场景越来越多,对于分支的管控,支持的命令更加丰富,那么我们如何灵活的使用相关的命令呢,请让我们一起探索
常用命令示例
git
仓库交互示例git init
git init repository_demo
初始化后,会在 repository_demo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中
git commit
$ git add *.c
$ git add README
$ git commit -m ‘首次提交’
git clone
git clone https://gitee.com/shang_xs/project-learn.git project-learn
git config
查看 git
配置信息
$ $ git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean – %f
filter.lfs.smudge=git-lfs smudge – %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=D:/software/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
user.email=‘[email protected]’
user.name=‘your_name_sxs’
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=https://gitee.com/shang_xs/project-learn.git
remote.origin.fetch=+refs/heads/:refs/remotes/origin/
branch.master.remote=origin
branch.master.merge=refs/heads/master
编辑当前
git
仓库的config
文件
git config -e
编辑整个
git
仓库的config
文件
git config -e --global
设置
全局
提交代码的用户信息
$ git config--global
user.name “shang_xs”
$ git config--global
user.email [email protected]
git add
该命令可将该文件添加到暂存区
添加一个或多个文件到暂存区
git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录
git add [dir]
添加当前目录下的所有文件到暂存区
git add .
git status
该命令用于查看在你上次提交之后是否有对文件进行再次修改, -s
标识简化结果显示
$
git status
$git status -s
git diff
git diff
命令比较文件的不同,即比较文件在暂存区和工作区的差异,
git diff
命令显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别
git diff
有两个主要的应用场景
尚未缓存的改动:git diff
查看已缓存的改动:git diff --cached
查看已缓存的与未缓存的所有改动:git diff HEAD
显示摘要而非整个diff
:git diff --stat
显示暂存区和工作区的差异
$git diff [file]
git diff 示例
git diff --git a/src/main/java/com/learn/demo/data/structure/LinkedBlockingQuestion.java b/src/main/java/com/learn/demo/data/structure/LinkedBlockingQuestion.java
index 4ff17d7..78c2440 100644
--- a/src/main/java/com/learn/demo/data/structure/LinkedBlockingQuestion.java
+++ b/src/main/java/com/learn/demo/data/structure/LinkedBlockingQuestion.java
@@ -28,13 +28,13 @@ public class LinkedBlockingQuestion {
}
- private static void testclear() {
- queue.clear();
- }
+// private static void testclear() {
+// queue.clear();
+// }
显示暂存区和上一次提交(commit)的差异
$ git diff --cached [file]
或
$ git diff --staged [file]
显示两次提交之间的差异
$ git diff [first-branch]…[second-branch]
git commit
git commit
命令将暂存区内容添加到本地仓库中
提交暂存区到本地仓库中
git commit -m [message]
提交暂存区的指定文件到仓库区
$git commit [file1] [file2] ... -m [message]
-a
参数设置修改文件后不需要执行git add
命令,直接来提交
$
git commit -a
设置提交代码时的用户信息
开始前我们需要先设置提交的用户信息,包括用户名和邮箱
$git config --global user.name “shang_xs”
$git config --global user.email [email protected]
如果去掉--global
参数只对当前仓库有效
git reset
git reset [--soft | --mixed | --hard] [HEAD]
--mixed
为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit
)保持一致,工作区文件内容保持不变
git reset [HEAD]
$
git reset HEAD^
# 回退所有内容到上一个版本
$git reset HEAD^ hello.php
# 回退hello.php
文件的版本到上一个版本
$git reset 052e
# 回退到指定版本
--soft
参数用于回退到某个版本
git reset --soft HEAD
$
git reset --soft HEAD~3
# 回退上上上一个版本
--hard
参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
git reset --hard HEAD
$
git reset –hard HEAD~3
# 回退上上上一个版本
$git reset –hard bae128
# 回退到某个版本回退点之前的所有信息
$git reset --hard origin/master
# 将本地的状态回退到和远程的一样
注释:谨慎使用–hard 参数
,它会删除回退点之前的所有信息
git rm
将文件从暂存区和工作区中删除
git rm
以下实例从暂存区和工作区中删除 runoob.txt 文件
git rm runoob.txt
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项
-f
强行从暂存区和工作区中删除修改后的
runoob.txt
文件
git rm -f runoob.txt
如果想把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用
--cached
选项即可
git rm --cached
以下实例从暂存区中删除
runoob.txt
文件
git rm --cached runoob.txt
递归删除
git rm –r *
git mv
git mv
命令用于移动或重命名一个文件、目录或软连接
git mv [file] [newfile]
如果新文件名已经存在,但还是要重命名它,可以使用
-f
参数
git mv -f [file] [newfile]
添加一个
README
文件
$git add README
然后对其重命名
$git mv README README.md
$ls
README.md
git log
查看历史提交记录
用
--oneline
选项来查看历史记录的简洁的版本
git log --oneline
用
--reverse
参数来逆向显示所有日志
$git log --reverse --oneline
查找指定用户的提交日志
git log --author
三周前且在四月十八日之后的所有提交,可以执行这个(还用了 --no-merges 选项以隐藏合并提交)
git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
git blame
看指定文件的修改记录,以列表形式查看指定文件的历史修改记录
git blame
git remote
显示所有远程仓库
git remote -v
显示某个远程仓库的信息
git remote show [remote]
$ git remote show https://gitee.com/shang_xs/project-learn.git
- remote https://gitee.com/shang_xs/project-learn.git
Fetch URL: https://gitee.com/shang_xs/project-learn.git
Push URL: https://gitee.com/shang_xs/project-learn.git
HEAD branch: master
Local ref configured for ‘git push’:
master pushes to master (up to date)
添加远程版本库
git remote add [shortname] [url]
shortname
为本地的版本库,提交到 gitee
$ git remote add origin [email protected]:shang_xs/project-learn.git
$ git push -u origin master
remote 其他相关命令
git remote rm name
# 删除远程仓库
git remote rename old_name new_name
# 修改仓库名
git fetch
从远端仓库提取数据并尝试合并到当前分支
git merge
该命令就是在执行
git fetch
之后紧接着执行git merge
远程分支到你所在的任意分支
假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行
git fetch [alias]
以上命令告诉 Git 去获取它有你没有的数据,然后你可以执行
git merge [alias]/[branch]
git pull
git pull
其实就是git fetch
和git merge FETCH_HEAD
的简写
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull
示例$
git pull
$git pull origin
将远程主机origin
的master
分支拉取过来,与本地的brantest
分支合并
git pull origin master:brantest
如果远程分支是与当前分支合并,则冒号后面的部分可以省略
git pull origin master
git push
git push
命用于从将本地的分支版本上传到远程并合并
命令格式如下:
git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分支名与远程分支名相同,则可以省略冒号
git push <远程主机名> <本地分支名>
git push
示例以下命令将本地的
master
分支推送到origin
主机的master
分支
$git push origin master
相等于
$git push origin master:master
如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数
git push --force origin master
删除主机的分支可以使用
--delete
参数,以下命令表示删除origin
主机的master
分支
git push origin --delete master
git branch
创建分支命令
git branch (branchname)
切换分支命令
git checkout (branchname)
当你切换分支的时候,
Git
会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录
合并分支命令
git merge
Git 分支管理
列出分支
git branch
如果我们要手动创建一个分支,执行
git branch (branchname)
即可
git branch dev
分支切换
git checkout -b dev
分支合并
git merge
冲突解决
git diff
查看冲突内容
手动处理冲突文件后,执行git add
git -am commit 'conflict resolution'
git tag
git -a
选项意为"创建一个带注解的标签"
git tag -a v1.0
git tag
示例$
git log
commit d8d8d68cbeb84ea63e8e8cabb9a1c4c33bfbc5d4 (HEAD -> master, origin/master, origin/HEAD)
Author: [email protected]
Date: Mon Jun 24 20:20:03 2019 +0800
快速排序
$
git tag -a v0.01 d8d8d68
git log --oneline --decorate --graph
如果我们要查看所有标签可以使用以下命令
$git tag
v0.01
v0.02
指定标签信息命令
git tag -a
-m "runoob.com标签"
PGP
签名标签命令
git tag -s
-m "runoob.com标签"
git cherry-pick
cherry-pick
命令"复制"一个提交节点并在当前分支做一次完全一样的新提交
git cherry-pick
示例如下示例,针对master、dev分支分别添加影响的C1~C9文件
$touch C7
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (dev)
$git add .
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (dev)
$git commit -m 'C7'
[dev 6ed1ba9] C7
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 C7
master
和 dev
分支文件列表shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (dev)
$ls
C1 C2 C5 C6 C7 C8 C9
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (dev)
$git checkout master
Switched to branch ‘master’
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$ls
C1 C2 C3 C4
cherry-pick
后,master
和dev
分支的文件列表shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$git log dev --oneline
adf7caf (dev) C9
ec2149d C8
6ed1ba9 C7
0bb1fd5 C6
67c11ba C5
3be0971 C2
c0988d3 C1
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$git cherry-pick 0bb1fd5
[master 759255d] C6
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$ls
C1 C2 C3 C4 C6
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$git cherry-pick 6ed1ba9 ec2149d
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$ls
C1 C2 C3 C4 C6 C7 C8
git cherry-pick
其他使用方式如果想应用连续的多个
commits
还可以使用git cherry-pick commit1..commitn
,应用SHA-1
校验和从commit1
到commitn
的commits
,注意这里并不包含commit1
,如果需要包含可以执行git cherry-pick commit1^..commitn
如果只想把某一个分支最后一个
commit
应用到当前分支,可以直接使用git cherry-pick branch-name
,这个命令的效果是,将branch-name
分支最后一个commit
应用到当前分支
当然实际使用过程中,使用cherry-pick
可能会出现冲突,例如提示如下:
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$ls
C1 C2 C3 C4 C6 C7 C8
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$git cherry-pick dev
# 摘取
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$ls
C1 C2 C3 C4 C6 C7 C8 C9
conflict
时解决冲突再执行
git add
将文件标记为以解决冲突,或者执行git rm
直接从暂存区和工作区删除文件,最后执行git cherry-pick --continue
,则完成这次cherry-pick
如果想要取消这次的
cherry-pick
操作可以执行git cherry-pick --abort
git rebase
衍合是合并命令的另一种选择,合并把两个父分支合并进行一次提交,提交历史不是线性的,衍合在当前分支上重演另一个分支的历史,提交历史是线性的, 本质上,这是线性化的自动的
cherry-pick
git rebase
示例
聂风
从master
分支commint
节点为C1
拉代码进行开发,目前提交了两次,提交的commit id
为C3
;
聂风
开发的同时步惊云
也从master
分支commint
节点为C1
拉代码开发并且开发完毕,他提交到了C9
,然后合到master
分支上了;
此时
聂风
开发测试完成,想提交代码到master
,在自己的feature
分支上执行了git rebase master
,即把master
分支给rebase
过来,由于步惊云
更早开发完并合了master
,如此就相当于聂风
是基于步惊云
的最新提交C9
进行的开发了;
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$git checkout bujingyun
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (bujingyun)
$touch Cbujingyun1
# 多个文件,多次提交
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (bujingyun)
$git add .
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (bujingyun)
$git commit -m 'Cbujingyun1'
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (bujingyun)
$ls
C1 C2 C3 C4 C6 C7 C8 C9 Cbujingyun1 Cbujingyun2 Cbujingyun3
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (bujingyun)
$git checkout master
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$git merge bujingyun
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$ls
C1 C2 C3 C4 C6 C7 C8 C9 Cbujingyun1 Cbujingyun2 Cbujingyun3
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (master)
$git checkout niefeng
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (niefeng)
$touch Cniefeng
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (niefeng)
$git add .
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (niefeng)
$git commit -m 'Cniefeng'
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (niefeng)
$ls
C1 C2 C3 C4 C6 C7 C8 C9 Cniefeng
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (niefeng)
$git rebase master
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (niefeng)
$ls
C1 C2 C3 C4 C6 C7 C8 C9 Cbujingyun1 Cbujingyun2 Cbujingyun3 Cniefeng
shang_xs@surf-395 MINGW64 /d/idea-workspace/git-tem (niefeng)
$git log --oneline
ebe09fb (HEAD -> niefeng
)Cniefeng
1c80786 (master, bujingyun
)Cbujingyun3
7305476Cbujingyun2
4167a4dCbujingyun1
所以,大多数公司,都不提倡或者禁止开发使用git rebase
, 也就是git pull -r
或git pull --rebase
git stash
与git stash save
一样
git stash save "xxx"
git stash
只会保存被git
管理的文件git stash list
返回缓存的列表git stash pop
将堆栈中最新的内容pop出来应用到当前分支上,且会删除堆中的记录git stash apply
与pop
相似,但他不会在堆栈中删除这条缓存,适合在多个分支中进行缓存应用
也可以进行指定git stash apply stash@{0}
git stash drop/git stash clear
git stash drop [名]
删除单个缓存,git stash drop stash@{0}
git stash clear
全清git stash show
git stash show [名]
显示与当前分支差异,git stash show stash@{0}
加上-p
可以看详细差异git stash branch
指定或最新缓存创建分支
相关命令参考
Quick reference guides
:
GitHub Cheat Sheet | Visual Git Cheat Sheet
Complete list of all commands
Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
Guides
Email
External Systems
Administration
Server Admin
Plumbing Commands