常见Git命令示例

常见Git命令示例

题记

众所周知,当前互联网开发代码、分支管理工具大多采用GitSVN,且Git使用的场景越来越多,对于分支的管控,支持的命令更加丰富,那么我们如何灵活的使用相关的命令呢,请让我们一起探索

常用命令示例

git仓库交互示例

常见Git命令示例_第1张图片

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
显示摘要而非整个 diffgit 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 fetchgit merge FETCH_HEAD 的简写
git pull <远程主机名> <远程分支名>:<本地分支名>

git pull示例

$ git pull
$ git pull origin
将远程主机 originmaster 分支拉取过来,与本地的 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

初始 masterdev 分支文件列表

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后,masterdev 分支的文件列表

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 校验和从commit1commitncommits,注意这里并不包含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进行的开发了;

git实操

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
7305476 Cbujingyun2
4167a4d Cbujingyun1
所以,大多数公司,都不提倡或者禁止开发使用 git rebase, 也就是git pull -rgit pull --rebase

git stash
  1. git stash
    git stash save一样
    git stash save "xxx"
    git stash 只会保存被 git 管理的文件
  2. git stash list
    返回缓存的列表
  3. git stash pop
    将堆栈中最新的内容pop出来应用到当前分支上,且会删除堆中的记录
  4. git stash apply
    pop相似,但他不会在堆栈中删除这条缓存,适合在多个分支中进行缓存应用
    也可以进行指定 git stash apply stash@{0}
  5. git stash drop/git stash clear
    git stash drop [名]删除单个缓存,git stash drop stash@{0}
    git stash clear全清
  6. git stash show
    git stash show [名] 显示与当前分支差异,git stash show stash@{0} 加上 -p 可以看详细差异
  7. git stash branch
    指定或最新缓存创建分支

相关命令参考

Quick reference guides:

GitHub Cheat Sheet | Visual Git Cheat Sheet
Complete list of all commands

Setup and Config

  • git
  • config
  • help
  • bugreport

Getting and Creating Projects

  • init
  • clone

Basic Snapshotting

  • add
  • status
  • diff
  • commit
  • notes
  • restore
  • reset
  • rm
  • mv

Branching and Merging

  • branch
  • checkout
  • switch
  • merge
  • mergetool
  • log
  • stash
  • tag
  • worktree

Sharing and Updating Projects

  • fetch
  • pull
  • push
  • remote
  • submodule

Inspection and Comparison

  • show
  • log
  • diff
  • difftool
  • range-diff
  • shortlog
  • describe

Patching

  • apply
  • cherry-pick
  • diff
  • rebase
  • revert

Debugging

  • bisect
  • blame
  • grep

Guides

  • gitattributes
  • Command-line interface conventions
  • Everyday Git
  • Frequently Asked Questions (FAQ)
  • Glossary
  • Hooks
  • gitignore
  • gitmodules
  • Revisions
  • Submodules
  • Tutorial
  • Workflows
  • All guides…

Email

  • am
  • apply
  • format-patch
  • send-email
  • request-pull

External Systems

  • svn
  • fast-import

Administration

  • clean
  • gc
  • fsck
  • reflog
  • filter-branch
  • instaweb
  • archive
  • bundle

Server Admin

  • daemon
  • update-server-info

Plumbing Commands

  • cat-file
  • check-ignore
  • checkout-index
  • commit-tree
  • count-objects
  • diff-index
  • for-each-ref
  • hash-object
  • ls-files
  • ls-tree
  • merge-base
  • read-tree
  • rev-list
  • rev-parse
  • show-ref
  • symbolic-ref
  • update-index
  • update-ref
  • verify-pack
  • write-tree

你可能感兴趣的:(Tools,git,分支管理,git命令)