文章定义是基础篇,作者结合平时常用以及仅自身的理解所做的日常记录
上图说明:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库/本地仓库
- remote repository:远程仓库
官方文档:Git-Book
配置
Git
的配置文件是 .gitconfig
,它的配置可以是 全局配置 (在用户主目录下
),也可以是 局部配置(在项目目录下
)。
查看当前配置
git config --list
```bash
Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso
$ git config --list
http.sslcainfo=D:/itwork/developer/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
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
credential.helper=manager-core
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
user.name=itsdf07
user.email=923xxx742@qq.com
http.proxy=localhost:10888
credential.helper=manager-core
```
编辑配置文件
- git config -e
[--global]
--global
参数为编辑全局用户配置文件
工程配置-账号 git config user.name “itsdf07”
工程配置-邮箱 git config user.email “923xxx742@qq.com”
全局配置-账号 git config --global
user.name “itsdf07”
全局配置-邮箱 git config --global
user.email “923xxx742@qq.com”
ssh 公钥/私钥 信息
- 本地生成公钥和私钥
ssh-keygen -t rsa -C "923xxx742@qq.com"
上面指令之后,一路回车到最后
- 公钥和私钥的本地路径
C:\Users\xxx\.ssh
- 提取 SSH 公钥配置
- 提取方案一:打开公钥文件
id_rsa.pub
,取出文件里的内容 - 提取方案一:执行
cat ~/.ssh/id_rsa.pub
- 提取方案一:打开公钥文件
Terminal git log 中文乱码解决
在 Android Studio 的 Terminal
命令窗口中使用 git 指令进行输出 历史提交记录时,出现信息乱码时,如下图
-
解决方案:文件
...\Git\etc\bash.bashrc
添加如下内容(可在最后一行添加),之后重启 Git 命令窗口即可(另起Terminal
窗口即可)export LANG="zh_CN.UTF-8" export LC_ALL="zh_CN.UTF-8"
操作指令
新建版本库
- git init
在当前目录新建一个Git
版本库,此时当前目录下会生成一个.git
文件夹 - git init
[project-name]
新建一个目录,并把新建目录初始化成一个Git
版本库,在新目录下会生成一个.git
文件夹 - git clone
[url]
在当前目录下下载一个远程Git
版本库,且包含它的所有历史提交记录Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso $ git clone git@gitee.com:itsdf07/preview-only.git Cloning into 'preview-only'... warning: You appear to have cloned an empty repository.
文件操作
- git add
[args]
- git add
[file1]
[file2]
...
添加指定文件到 暂存区 - git add
[dir]
添加指定目录到 暂存区,包括子目录
- git add .
添加当前目录下的所有文件到 暂存区 - git add -p
添加当前目录的所有文件到 暂存区,且在添加每个变化文件前都会被要求确认(对于同一个文件的多处变化,可以实现分次提交)
- git add
- git rm --cached
[file]
停止追踪 暂存区 的指定文件,但该文件会保留在 工作区 - git mv
[file-original]
[file-renamed]
重命名文件(该文件需可跟踪的),并且将这个改名放入 暂存区 - git rm
[file1] [file2] ...
删除 工作区 文件(该文件需可跟踪的),并且将这次删除放入 暂存区
代码提交
-
git commit -m
[message]
提交 暂存区 到 本地仓库 -
git commit
[file1] [file2] ...
-m[message]
提交 暂存区 的指定文件到 本地仓库 -
git commit -a
提交 工作区 自上次commit
之后的变化,直接到 本地仓库 -
git commit -v
提交时显示所有diff
信息 -
git commit --amend -m
[message]
使用一次新的commit
,替代上一次提交,如果代码没有任何新变化,则用来改写上一次commit
的提交信息 -
git commit --amend
[file1] [file2] ...
重做上一次commit
,并包括指定文件的新变化 -
git push <远程主机名> <本地分支名>:<远程分支名>
把指定的本地分支
推送到远程主机名
上对应的远程分支名
上git push origin master:refs/for/master
origin
即远程主机名
第一个master
即本地分支名
第二个master
即远程分支名
git push origin master
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建git push origin HEAD:refs/for/master
origin
即远程主机名
HEAD
是一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名,git 这样就可以知道你工作在哪个分支
refs/for
意义在于我们提交代码到服务器之后是需要经过code review
之后才能进行merge
的
refs/heads
不需要
查看信息
选项 | 说明 |
---|---|
-n | (按 数量 )显示前n条log |
–author=[name] | (按 作者 )显示指定作者的提交日志 |
–grep=[keyworkd] | (按 commit 描述)指定提交内容进行 模糊匹配 提交记录 |
-p [file] | 显示 指定文件 的每一次 commit 的 内容差异 |
–stat | 显示 commit 提交日志,以及每次 commit 发生变更的文件清单及其信息 |
–name-only | 显示 commit 提交日志,以及每次 commit 发生变更的文件清单 |
–name-status | 显示 commit 提交日志,并显示 新增、修改、删除 等状态的 文件清单 |
–abbrev-commit | 显示 commit 提交日志,并仅显示 SHA-1 校验和所有 40 个字符中的前几个字符 |
–relative-date | 显示 commit 提交日志,并使用较短的 相对时间 而不是完整格式显示日期(比如 2 weeks ago ) |
–graph | 显示 commit 提交日志,并在日志旁以 ASCII 图形显示分支与合并历史 |
–pretty | 使用其他格式显示 commit 提交日志。可用的选项包括 oneline 、short 、full 、fuller 和 format (用来定义自己的格式) |
–oneline | 以精简模式显示 commit 提交日志 |
- git status
可以用来查看当前 工作区 和 暂存区 的改动文件,其中对文件的状态描述中,new file
表示该文件是新增,modified
表示改文件是修改,当然文件状态并非只有这两种Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git status On branch master Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup) Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: GIT_TEST_FILE_1.txt modified: README.md deleted: GIT_TEST_FILE_2.txt
- git log
用于查看当前分支的commit
提交日志,且会按时间先后顺序列出所有的提交日志,最近的更新排在最上面
– 如果记录过多,则可向上或者向下控制显示
– 按q
可退出历史记录列表查看Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git log commit aff03419bc01a86ef8a33fc9fdc6e5a2971d4260 (HEAD -> master, origin/master) Author: itsdf07 <923xxx742@qq.com> Date: Fri Jun 24 10:32:35 2022 +0800 第三次提交内容 commit 61efd9000b1ebedb2366801de61f3f7bef4f8f31 Author: itsdf07 <923xxx742@qq.com> Date: Fri Jun 24 10:31:59 2022 +0800 第二次提交内容 commit 418576c770b8eb66f3ff513a0b93eef9aebf1812 Author: itsdf07 <923xxx742@qq.com> Date: Fri Jun 24 10:30:58 2022 +0800 第一次提交内容
针对性的过滤参数如下:
- git log
-p
[file]
显示指定文件
的每一次 commit 的内容差异
Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git log -p README.md commit aff03419bc01a86ef8a33fc9fdc6e5a2971d4260 (HEAD -> master, origin/master) Author: itsdf07 <923xxx742@qq.com> Date: Fri Jun 24 10:32:35 2022 +0800 第三次提交内容 diff --git a/README.md b/README.md index ab59ce0..fe2656d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ 1.第一次提交内容<br> -2.第二次提交内容<br> \ No newline at end of file +2.第二次提交内容<br> +3.第三次提交内容<br> \ No newline at end of file commit 61efd9000b1ebedb2366801de61f3f7bef4f8f31 Author: itsdf07 <923xxx742@qq.com> Date: Fri Jun 24 10:31:59 2022 +0800 第二次提交内容 diff --git a/README.md b/README.md index 19ba7f3..ab59ce0 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -1.第一次提交内容<br> \ No newline at end of file +1.第一次提交内容<br> +2.第二次提交内容<br> \ No newline at end of file commit 418576c770b8eb66f3ff513a0b93eef9aebf1812 Author: itsdf07 <923xxx742@qq.com> Date: Fri Jun 24 10:30:58 2022 +0800 第一次提交内容 diff --git a/README.md b/README.md new file mode 100644 index 0000000..19ba7f3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +1.第一次提交内容<br> \ No newline at end of file
- git log
--stat
显示commit
提交日志,以及每次commit
发生变更的文件清单及其信息
Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git log --stat commit 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master) Author: itsdf07 <923255742@qq.com> Date: Sun Dec 4 09:28:56 2022 +0800 修改 README.md,新增 GIT_TEST_FILE_1.txt GIT_TEST_FILE_1.txt | 0 README.md | 1 + 2 files changed, 1 insertion(+) commit ab0ff6da938fa1f43f0d3ba94ba7341b1d658201 Author: itsdf07 <923255742@qq.com> Date: Sun Dec 4 08:26:52 2022 +0800 创建空文件:README.md README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-)
- git log
--name-only
显示commit
提交日志,以及每次commit
发生变更的文件清单
Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git log --name-only commit 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master) Author: itsdf07 <923255742@qq.com> Date: Sun Dec 4 09:28:56 2022 +0800 修改 README.md,新增 GIT_TEST_FILE_1.txt GIT_TEST_FILE_1.txt README.md commit ab0ff6da938fa1f43f0d3ba94ba7341b1d658201 Author: itsdf07 <923255742@qq.com> Date: Sun Dec 4 08:26:52 2022 +0800 创建空文件:README.md README.md
- git log
--name-status
显示commit
提交日志,以及每次commit
的文件状态清单
,如新增
、修改
、删除
等Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git log --name-status commit 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master) Author: itsdf07 <923255742@qq.com> Date: Sun Dec 4 09:28:56 2022 +0800 修改 README.md,新增 GIT_TEST_FILE_1.txt A GIT_TEST_FILE_1.txt M README.md commit ab0ff6da938fa1f43f0d3ba94ba7341b1d658201 Author: itsdf07 <923255742@qq.com> Date: Sun Dec 4 08:26:52 2022 +0800 创建空文件:README.md A README.md
- git log
--relative-date
显示commit
提交日志,并使用较短的相对时间
而不是完整格式显示日期(比如2 weeks ago
)Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git log --relative-date commit 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master) Author: itsdf07 <923255742@qq.com> Date: 6 hours ago 修改 README.md,新增 GIT_TEST_FILE_1.txt commit ab0ff6da938fa1f43f0d3ba94ba7341b1d658201 Author: itsdf07 <923255742@qq.com> Date: 7 hours ago 创建空文件:README.md
- git log
--graph
以图形模式显示commit
提交日志,在日志旁以 ASCII 图形显示分支与合并历史Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git log --graph * commit aff03419bc01a86ef8a33fc9fdc6e5a2971d4260 (HEAD -> master, origin/master) | Author: itsdf07 <923xxx742@qq.com> | Date: Fri Jun 24 10:32:35 2022 +0800 | | 第三次提交内容 | * commit 61efd9000b1ebedb2366801de61f3f7bef4f8f31 | Author: itsdf07 <923xxx742@qq.com> | Date: Fri Jun 24 10:31:59 2022 +0800 | | 第二次提交内容 | * commit 418576c770b8eb66f3ff513a0b93eef9aebf1812 Author: itsdf07 <923xxx742@qq.com> Date: Fri Jun 24 10:30:58 2022 +0800 第一次提交内容
- git log
--oneline
以精简模式显示commit
提交日志Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master) $ git log --oneline 4a70dbb (HEAD -> master) 修改 README.md,新增 GIT_TEST_FILE_1.txt ab0ff6d 创建空文件:README.md
- git log
--pretty=[oneline]
[short]
[full]
[fuller]
使用其他格式显示commit
提交日志。可用的选项包括oneline
、short
、full
、fuller
和format
(用来定义自己的格式)$ git log --pretty=oneline 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master) 修改 README.md,新增 GIT_TEST_FILE_1.txt ab0ff6da938fa1f43f0d3ba94ba7341b1d658201 创建空文件:README.md
- git log
--author=[name]
(按Author
)显示指定作者
的提交日志
- git log
--grep=[keyword]
(按commit
描述)显示指定提交描述
进行模糊匹配的提交日志
- git log
-n
(按数量
)显示前n
条提交日志
- git log
分支
用于切换分支或恢复工作树文件
-
git branch
列出所有本地分支
- git branch
-r
列出所有远程分支
- git branch
-a
列出所有本地分支
和远程分支
- git branch
[local-branch]
新建一个本地分支
,但依然停留在当前分支 - git branch
[local-branch]
[commit]
新建一个 指向指定commit
的本地分支
, - git branch
--track
[local-branch]
[remote-branch]
新建一个本地分支
,并与指定的远程分支
建立追踪关系 - git branch
--set-upstream
[local-branch]
[remote-branch]
在现有本地分支
与指定的远程分支
之间建立追踪关系 - git branch
-d
[local-branch]
删除本地分支
- git branch
-dr
[remote/remote-name]
删除远程分支
,git push origin --delete [remote-name]
- git branch
-
git checkout
local-branch
切换到已存在
的指定本地分支
,并更新
工作区 -
git checkout -b
local-branch
新建一个本地分支
,并切换到该分支 -
git checkout
-
切换到上一个分支 -
git checkout -b
[local-branch]
origin/[remote-name]
将远程仓库里指定的分支拉取到本地,并在本地创建一个分支与指定远程仓库分支关联起来(其中,本地分支明白不一定要与远程分支名称相同),在通过本地分支切换、检出文件进行实现远程分支的切换 -
放弃修改
git checkout [-q] [-f] [-m] [<branch>] git checkout [-q] [-f] [-m] --detach [<branch>] git checkout [-q] [-f] [-m] [--detach] <commit> git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>] git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>… git checkout [-p|--patch] [<tree-ish>] [--] [<paths>…]
-
git checkout
.
放弃工作区的所有内容修改itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git status On branch branch_1 Your branch is up to date with 'origin/feat/branch_1'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: README.md no changes added to commit (use "git add" and/or "git commit -a") itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git checkout . itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git status On branch branch_1 Your branch is up to date with 'origin/feat/branch_1'. nothing to commit, working tree clean itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $
-
git checkout
[file]
放弃工作区的指定文件的内容修改itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git status On branch branch_1 Your branch is up to date with 'origin/feat/branch_1'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: README.md no changes added to commit (use "git add" and/or "git commit -a") itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git checkout README.md itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git status On branch branch_1 Your branch is up to date with 'origin/feat/branch_1'. nothing to commit, working tree clean itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $
-
git checkout
-f
放弃工作区和暂存区的所有内容修改itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git status On branch branch_1 Your branch is up to date with 'origin/feat/branch_1'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README_2.md Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: README.md itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git checkout -f Your branch is up to date with 'origin/feat/branch_1'. itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $ git status On branch branch_1 Your branch is up to date with 'origin/feat/branch_1'. nothing to commit, working tree clean itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1) $
文件差异
- git diff
[file]
- 当 工作区 有改动,暂存区
为空
,对比的是 工作区 与 最后一次提交 到仓库的文件差异;
- 当 工作区 有改动,暂存区
不为空
,对比的是 工作区 与 暂存区 的文件差异
- 当 工作区 有改动,暂存区
- git diff
--cached
[file]
对比的是 暂存区 和 最后一次提交 到仓库的文件差异(git diff --cached
和git diff –staged
相同作用)
- git diff
HEAD
[file]
对比 工作区 与 最后一次提交 到仓库的文件差异。
- git diff
HEAD~1
[file]
对比 工作区 与 最后一次提交往前数 X 个版本 的文件差异,其中X为正整数
git cherry-pick
-
git cherry-pick <提交的commit ID>
把指定的提交(commit)应用于其他分支,如有 A、B 两分支,想把 A 中的指定提交同步到 B 分支,则先 checkout 到 B 分支后,执行 cherry-pick 对应的 commit 号,即把 A 的 该次提交应用到了当前分支(B分支)该过程中,如果出现了代码冲突,那么 cherry-pick 就会停下来,让用户决定如何继续操作
-
--continue
用户解决代码冲突后,第一步将修改后的文件重新加入暂存区(git add .),第二步使用 continue 参数,让 cherry-pick 过程继续执行。$ git cherry-pick --continue
-
--abort
用户选择放弃代码冲突后的合并动作,回到 cherry-pick 动作之前的状态$ git cherry-pick --abort
-
--quit
用户选择退出 cherry-pick ,但是合并内容不会回到动作之前的状态$ git cherry-pick --quit
实际场景
- 分支间差异内容同步
Release 分支:发布版本
AD 分支:开发版本
场景:Release 分支发布之后,新增了功能 ①,且新增部分并未同步至 AD 分支中;同理,AD 新增功能 ② 尚未通过测试,故暂时不能同步至 Release 分支中;
需求:便捷的把功能 ① 同步至 AD 分支中
瓶颈:提交内容较多,且可能存在冲突,无法简单的使用 cherry-pick 进行同步
操作流程:- 仅在本地仓库中,把 AD 分支新增的 ② 功能同步至 Release 中:实现本地 Release 分支拥有全部功能
- commit 到本地后得到 commitId
- checkout 到 AD 分支,然后:
git reset --hard [刚刚的commitId]:实现 AD 分支滚动至与 Release 分支的功能保持一致
git reset --soft origin/AD: - git commit -m “提交记录”
更新中。。。。。。