# git 操作指南

# 创建新仓库以及到正常提交代码

  1. 在 github 网站上点击new, 进入项目配置页面。
  2. 填写项目名:Repository name
  3. 填写项目描述:Description
  4. 选择私有还是公开:PublicPrivate
  5. 点击Create repository 完成创建 在这里插入图片描述 在这里插入图片描述
  6. 复制这个链接 在这里插入图片描述
  7. git clone https://github.com/wenbintian/test.git 此时会生成一个包含.git文件夹的项目 git clone https://github.com/wenbintian/test.git 新的名称 可用于重新命名项目名称
D:\test>git clone https://github.com/wenbintian/test.git
D:\test>git clone https://github.com/wenbintian/test.git project-name
  1. 新增README.md文件
D:\test\test>echo '# test' >> README.md
  1. 此时就可以正常的提交了
D:\test\test>git add .

D:\test\test>git commit -m '第一次提交'
[master (root-commit) 33c940a] '第一次提交'
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

D:\test\test>git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 238 bytes | 238.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/wenbintian/test.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

# 工作流

  • Working Tree 当前的工作区域
  • Index/Stage 暂存区域,和 git stash 命令暂存的地方不一样。使用 git add xx,就可以将 xx 添加近 Stage 里面
  • Repository 提交的历史,即使用 git commit 提交后的结果

在这里插入图片描述 在这里插入图片描述

# stash 暂存操作

# 使用场景

  • 当准备提交代码时发现有一个文件的改动是多余的,想直接还原的又担心之后想要查看这些改动的代码,想保存它又不想增加一个多余的提交,此时就可以使用stash缓存起来。
  • 当开发一个需求开发一半的时候,来了个紧急 bug,正常情况可以把完成一半的代码commit提交到本地仓库,然后创建切换到一个新的分支去修改 bug。但这样的话往往 log 上会有大量不必要的记录。stash就能解决这样的需求,使用git stash把当前完成一半的代码缓存起来推入Git的栈中,然后把紧急的代码改完后提交,最后再git stash pop把完成一半的代码拉回到本地代码中

# 操作汇总

PS D:\project\git\test-project> git stash help
usage: git stash list [<options>]
   or: git stash show [<stash>]
   or: git stash drop [-q|--quiet] [<stash>]
   or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
   or: git stash branch <branchname> [<stash>]
   or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
                       [-u|--include-untracked] [-a|--all] [<message>]]
   or: git stash clear

# 操作详解

# git stash list

列出您当前拥有的存储条目 如:

PS D:\project\git\test-project> git stash list
stash@{0}: On master: Uncommitted changes before Update at 2019/9/30 14:27
stash@{1}: On master: Uncommitted changes before Update at 2019/9/23 9:39
stash@{2}: On master: Uncommitted changes before Update at 2019/8/15 18:00

# git stash show

显示存储条目中记录的更改,作为隐藏内容和提交首次创建存储条目时的提交之间的差异(注意只是列出具体哪些文件的差异,具体代码的差异是没有列出来的) git stash show 'stash@{0}' 可以查看某一条的差异,注意 stash@{0} 需要单引号 如:

  PS D:\project\git\test-project> git stash show 'stash@{0}'
 app/common/api-class.js                            |     4 +-
 app/config/config.js                               |     4 +
 app/his5/menuFrame/index.js                        |     6 +-
 app/test/demo-zoeRoute.js                          |     8 +-

# git stash show 'stash@{0}' -p

可以查看某一条里代码的差异.

D:\project\git\web-portal> git stash show 'stash@{0}' -p
diff --git a/public/vue/js/portal/common/common.js b/public/vue/js/portal/common/common.js
index 4579074..e83ab24 100644
index 4579074..e83ab24 100644
--- a/public/vue/js/portal/common/common.js
+++ b/public/vue/js/portal/common/common.js
@@ -50,6 +50,10 @@ export default {
             this.peopleWebsocket && this.peopleWebsocket.send(JSON.stringify(obj));//回复说 在线
           }
         }else {
+          if(socketData.clearLoginFlag){
+            this.tackUnlock(true);
+            return;
+          }
           if(!socketData.validCheck){//validCheck为false说明该用户被作废了

# git stash drop <stash>

从存储条目列表中删除单个存储条目。如果没有<stash>给出,它将删除最新的一个

 PS D:\project\git\web-hip> git stash drop 'stash@{4}'
Dropped stash@{4} (a7c965742435d921d2f43bb553dce83738115089)

# git stash push -m '描述说明'

注意旧版本不支持 push,则需要用 git stash save '描述说明' 代替 将您的本地修改保存到新的存储条目中,并将它们回滚到 HEAD(在工作树和索引中)

# git stash pop <stash>

从存储列表中删除一个单独的存储状态并将其应用于当前工作树状态的顶部,若 <stash>没传,值是将 stash 里最新的一个 即 stash@{0}释放出来到本地代码上。

# git stash clear

删除所有的存储条目

# branch 分支操作

# 含义描述

  • 分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master是“默认的”。在其他分支上进行开发,完成后再将它们合并到主分支上。 在这里插入图片描述

# 操作汇总

usage: git branch [<options>] [-r | -a] [--merged] [--no-merged]
   or: git branch [<options>] [-l] [-f] <branch-name> [<start-point>]
   or: git branch [<options>] [-r] (-d | -D) <branch-name>...
   or: git branch [<options>] (-m | -M) [<old-branch>] <new-branch>
   or: git branch [<options>] (-c | -C) [<old-branch>] <new-branch>
   or: git branch [<options>] [-r | -a] [--points-at]
   or: git branch [<options>] [-r | -a] [--format]

# 操作详解

# git checkout -b 新分支名称(是以下命令的组合)

  • git branch 分支名称: 新建本地分支
  • git checkout 分支名称: 切换到某一分支

创建新的本地分支

# git checkout 分支名称

切换到某个分支

# git branch -d 分支名称 / git branch -D 分支名称

删除某个分支 (注意不要删除当前所在的分支,比如当前是处在 test1 分支,然后去删 test1 分支,这样是不会成功的) 大小 D 有区别 -D表示强制删除,若本地分支没有合并到其他分支或者没有远程关联分支,则-d会报错The branch '***' is not fully merged,用-D就可以强制删除了。

# git branch -a

显示所有的分支(若没看到所有的分支,则先执行git fetch一下)

# git branch

显示当前的本地分支

# git branch -r

显示所有的远程分支

# 本地分支与远程分支的关联操作

# git branch -vv

查看本地分支与远程分支的关联关系

如下:本地分支【test】跟远程分支【origin/test】关联,而 test2 没有跟远程分支关联

D:\test\test>git branch -vv
  master d5a8c2d [origin/master] deploy
* test   d5a8c2d [origin/test] deploy
  test2

# git branch -u origin/testgit branch --set-upstream origin/test

将当前分支跟远程分支【origin/test】建立关联(建立在已经存在远程分支的基础上)

# git branch --set-upstream-to=origin/test test6

指定当前分支与远程分支建立关联(此处是本地分支【test6】与远程分支【origin/test】建立关联)

# git push --set-upstream origin test

将本地分支内容合并到远程分支上

有两种情况

  • 当前打开的本地分支跟远程分支相同,如:都为分支【test】,则不管远程分支有没有创建,则都会把本地分支合并到远程分支【test】上。(如远程分支不存在,则会自动创建)
  • 当前打开的本地分支跟远程分支不同,如:本地分支为【test3】,远程分支为【test】,则根据远程分支是否存在做处理
    • 远程分支不存在,则报错。
    • 远程分支存在,则会把本地分支【test】合并到远程分支上(注意是本地分支【test】,而不是当前打开的本地分支【test3】)

# git branch --unset-upstream

解除当前本地分支与远程分支的关联

# git push origin --delete test3

删除远程分支【test3】

# commit 命令

# 操作详解

# git add .

表示添加新增的文件

# git commit -m '提交说明'

表示提交修改的文件

# git reflog

查看提交的记录

D:\test\test>git reflog
a806361 (HEAD -> master, origin/master) HEAD@{0}: commit: '<E7><E4><A4>'
33c940a HEAD@{1}: commit (initial): '<AC><AC>'

# 回退操作

两种回退方式

  1. git reset --hard 版本号
  2. git revert -n 版本号

# git reset --hard 版本号

回退到上一个版本,可选 --hard/--soft/--mixed. 默认是--mixed

--mixed: 将Commit History(commit 后的内容)和Working Directory(当前本地修改的内容)统一重置回到 Working Directory状态中,不移除当前的变更内容;

--hard: 直接清空Commit History(commit 后的内容)和Working Directory(当前本地修改的内容)

--soft: 重置的同时保留Working Directory(当前本地修改的内容) 和将Commit History(commit 后的内容)重置为Index/Stage暂存区域

  1. 先查询版本号 git log

commit 后面那串数字就是版本号

guo@guoMacBook-Pro blog % git log
commit ee59be94063350913a9ccd9e0c639f2ccd368dca (HEAD -> master, origin/master, origin/HEAD)
Author: guo <guoran@gaoding.com>
Date:   Wed Jul 14 15:54:41 2021 +0800
   fix: 这个是最新提交的

commit a0ec03d64bab2a220678252d5b1e5aeb608f6ae0
Author: wenbintian <972619117@qq.com>
Date:   Wed Jul 14 07:53:37 2021 +0000
   feat: 提交文件text1

commit db7a0d665faa9ef9f52878a839aeb8c78f957615
Author: wenbintian <972619117@qq.com>
Date:   Wed Jul 12 07:52:37 2021 +0000
   feat: 提交文件text2
  1. git reset --hard a0ec03d64bab2a220678252d5b1e5aeb608f6ae0

代表回退到这个版本,然后在这个版本之后的代码都会被还原掉,commit 记录也会找不到(但是可以在 git reflog 找到记录),操作需要谨慎

  1. 再次执行 git log, 最新的commit记录会被清掉(可在git reflog中找到记录)。
guo@guoMacBook-Pro blog % git log
commit a0ec03d64bab2a220678252d5b1e5aeb608f6ae0
Author: wenbintian <972619117@qq.com>
Date:   Wed Jul 14 07:53:37 2021 +0000
   feat: 提交文件text1

commit db7a0d665faa9ef9f52878a839aeb8c78f957615
Author: wenbintian <972619117@qq.com>
Date:   Wed Jul 12 07:52:37 2021 +0000
   feat: 提交文件text2

# git revert -n 版本号

将某一个版本反做,会增加一条新的commit记录。

  1. 先查询版本号git log
guo@guoMacBook-Pro blog % git log
commit ee59be94063350913a9ccd9e0c639f2ccd368dca (HEAD -> master, origin/master, origin/HEAD)
Author: guo <guoran@gaoding.com>
Date:   Wed Jul 14 15:54:41 2021 +0800
   fix: 这个是最新提交的

commit a0ec03d64bab2a220678252d5b1e5aeb608f6ae0
Author: wenbintian <972619117@qq.com>
Date:   Wed Jul 14 07:53:37 2021 +0000
   feat: 提交文件text1

commit db7a0d665faa9ef9f52878a839aeb8c78f957615
Author: wenbintian <972619117@qq.com>
Date:   Wed Jul 12 07:52:37 2021 +0000
   feat: 提交文件text2
  1. git revert -n a0ec03d64bab2a220678252d5b1e5aeb608f6ae0

代表反做到这个版本,会生成新的代码,然后再进行 git commit / git pull操作,此时有新的commit记录

  1. 再次执行 git log, 会产生最新的commit记录
guo@guoMacBook-Pro blog % git log
commit 58f0ffbfdf8a803e520ad3cc62140f4482fc19a6 (HEAD -> master, origin/master, origin/HEAD)
Author: guo <guoran@gaoding.com>
Date:   Wed Jul 16 13:53:42 2021 +0800
   fix: 这个是还原【提交文件text1】的最新代码

commit ee59be94063350913a9ccd9e0c639f2ccd368dca (HEAD -> master, origin/master, origin/HEAD)
Author: guo <guoran@gaoding.com>
Date:   Wed Jul 14 15:54:41 2021 +0800
   fix: 这个是最新提交的

commit a0ec03d64bab2a220678252d5b1e5aeb608f6ae0
Author: wenbintian <972619117@qq.com>
Date:   Wed Jul 14 07:53:37 2021 +0000
   feat: 提交文件text1

commit db7a0d665faa9ef9f52878a839aeb8c78f957615
Author: wenbintian <972619117@qq.com>
Date:   Wed Jul 12 07:52:37 2021 +0000
   feat: 提交文件text2

# cherry-pick 操作

# 用途

用于合并部分的commit代码

# 操作

  1. git reflog 查看需要 pick 的 commitID
  2. git cherry-pick commitID 直接把要的commitID合并到当前分支
  3. git cherry-pick --abort 撤销当前合并的 commit

# worktree 操作

# 用途

可以同时维护多个分支代码、可以对比不同分支代码的行为。

# 操作汇总

usage: git worktree add [<options>] <path> [<commit-ish>]
   or: git worktree list [<options>]
   or: git worktree lock [<options>] <path>
   or: git worktree move <worktree> <new-path>
   or: git worktree prune [<options>]
   or: git worktree remove [<options>] <worktree>
   or: git worktree unlock <path>

# 操作详解

# git worktree add [新路径]

基于当前分支,新建一个 worktree 目录,新的分支名就是新建目录的名称。一般新路径都是 ../,这样才会与当前项目同目录。

D:\project\git\web-portal> git worktree add ../test-work

# git worktree add <新路径> -b <新分支名 A>

基于当前分支,新建一个 worktree 目录,新的分支名就是<新分支名 A>。如下分支名为 test-tag。

D:\project\git\web-portal> git worktree add ../test-work test-tag

# git worktree add <新路径> -b <新分支名 A> <迁出的分支名 A>

基于指定的源分支<迁出的分支名 A>,新建一个 worktree 目录,新的分支名就是<新分支名 A>。如下基于 从 mater 分支迁出一个分支名为 test-tag。

D:\project\git\web-portal> git worktree add ../test-work test-tag master

# git worktree remove <新分支名 A>

移除工作区分支<新分支名 A>

D:\project\git\web-portal> git worktree remove test-tag

# git worktree list

显示当前有多少个工作区

D:\project\git\web-portal> git worktree list

# 统计git项目行数

# 操作详解

# 显示项目文件的所有文件列表、及行数(已经删除的文件显示为空)

D:\project\git\web-portal> git ls-files | xargs wc -l

# 显示某文件夹下的代码量

src base 代表 base 文件夹下的

D:\project\git\web-portal> git ls-files src base | xargs wc -l

# 统计base下的文件夹并排除某些文件或文件夹

src base 代表 base 文件夹下的 grep -Ev 'file|.png|.zip' 代表排除 file 文件夹和 png/zip 文件

D:\project\git\web-portal> git ls-files src base | grep -Ev 'file|.png|.zip' | xargs wc -l

# 显示项目代码总行数

D:\project\git\web-portal> git ls-files | xargs cat | wc -l

# 显示项目文件列表

D:\project\git\web-portal> git ls-files

# 参考

git 使用建议指南 (opens new window)

Git - Book (opens new window)

git-stash 用法小结 (opens new window)

git-reset 三种模式 (opens new window)

最后一次修改时间: 8/3/2022, 3:47:39 PM