梭梭带你学Git
Top
Ver: 003
目录
Git 官方下载地址
Git Book 官方中文文档
常用命令
# 下载特定分支的代码
git clone -b 分支名 仓库地址
# 克隆远程仓库的时候,自定义本地仓库的名字
git clone https://github.com/libgit2/libgit2 mylibgit
# 克隆远程仓库时,同时克隆子模块
git clone --recursive <project url>
# git clone 所有分支的代码
git clone --mirror <repository-url>
cd <repo_dir> && git fetch --all
# 拉取特定分支的代码, 并合并到当前所在分支,一定要注意; 注意;
git pull origin 分支名称
git pull --all
# 推送特定分支的代码
git push origin 分支名称
# git status : 缩短状态命令的输出
git status -s
# 比较工作目录中当前文件和暂存区域快照之间的差异
git diff
# 比对已暂存文件与最后一次提交的文件差异
git diff --staged
git diff --cached # 查看已经暂存起来的变化( --staged 和 --cached 是同义词):
# 使用图形化的工具或外部 diff 工具来比较差异
# 使用 git difftool --tool-help 命令来看你的系统支持哪些 Git Diff 插件
git difftool
# 设置编辑器
git config --global core.editor
# 自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
git commit -a
git commit -a -m "master merge commit”
# 以web界面显示log的参数
git help --web log
# 给文件重命名
git mv main.py mymain.py
# 删除文件
git rm main.py
Git 基础使用流程图
常用操作
全局变量配置
# 列出所有 Git 当时能找到的配置
git config --list
git config --global --list
git config --system --list
git config --local --list
# 检查Git的某一项设置
git config <key>
#
# 添加【修改】变量配置语法
git config [配置保存位置] [配置项] [配置值]
git config --global user.name "xxx"
git config --global user.email "xxx"
# 删除变量配置语法
git config [配置保存位置] --unset [配置项]
git config --global --unset user.name
# 将当前的目录设置为安全的存储库
git config --global --add safe.directory D:/JavaProjects/demo
# 配置系统默认的文本编辑器
git config --global core.editor emacs
# 设置跳过 SSL 验证
git config --global http.sslVerify false
# 设置 Git 缓冲区大小, 必须的,小了时,克隆文件常常意外中断
git config --global http.postBuffer 52428800000
# 若网络波动,可以尝试取消相关的网络限制,可设置如下两个变量
git config --global http.lowSpeedTime 999999
git config --global http.lowSpeedLimit 0
# 若传输文件实在太大,可以尝试增大压缩率(压缩率大小根据实际情况设置)
git config --global core.compression 3 # 0 表示不压缩
# 设置如下 3 个环境变量,可使 克隆仓库时 显示详细信息
export GIT_TRACE_PACKET=1
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1
# Git 配置网络代理
git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:port
git config --global https.proxy https://proxyuser:proxypwd@proxy.server.com:port
# 注意:上述命令中的proxyuser和proxypwd应该替换为实际的代理用户名和密码,proxy.server.com
以 Git 配置文件设置变量
# 用户级全局变量的设置 --- 对该用户的所有仓库有效
配置文件为: ~/.gitconfig ; 配置命令如下:
git config --global xxx
# 系统级全局变量的配置 --- 对该系统所有仓库有效
配置文件为: /etc/gitconfig ; 配置命令如下:
git config --system xxx
[user] name = caoxinyu email = 1455971532@qq.com [alias] ch = checkou st = status staust = 'gitst' cf = config ck = checkout ft = fetch fh = fetch br = branch brv = branch --v geturl = config --get remote.origin.url bs = bisect lg = log cfg = config --global cfga = config --global alias. pull = pl pl = pull --rebase cm = commit -c HEAD ps = push lsr = ls-remote --heads udc = reset HEAD~ ftg = fetch --tags am = commit -amend cmd = commit --amend rsh = reset HEAD~ cmi = commit --interactive -c HEAD --reset-author i = --interactive rss = reset --soft rmc = rm --cached cp = cherry-pick cpx = cherry-pick -x bl = blame gk = gitk ltn = ls-tree -r HEAD~ --name-only lt = ls-tree -r HEAD~ --name-only ltng = ls-tree -r HEAD~ --name-only |grep lgd = log -p --full-diff bcm = "branch -a --contains " brc = branch -a --contains tagc = tag --contains [i18n] commitencoding = utf-8 logoutputencoding = utf-8 [core] quotepath = false editor = vim [gui] encoding = utf-8 [i18n "commit"] encoding = utf-8 [http] [credential] helper = manager
# 局部变量的配置 --- 只对该仓库有效 --- 默认为该级别
配置文件为: .git/config ; 配置命令如下:
git config --local xxx
[user] name = suosuo1930 email = xxxx@aliyun.com
变量配置优先级
# 优先级遵循【从内到外】的原则;即:
--local > --global > --system
其他变量配置
# 查看某一个commit 存在于哪些分支
git config --global alias.brc "branch -a --contains"
# 查看某一个commit 存在于哪些tag
git config --global alias.tagc "tag --contains"
克隆 Clone
相关
# 克隆指定的分支或标签:
git clone --branch <version number> <repository_url> --depth 1
其中,–branch选项用于指定要克隆的分支或标签,–depth 1选项表示深度为1的深度克隆(只获取指定标签最新的上传,而不获取该版本所有的上传历史)。如果您需要完整的历史记录,可以省略–depth 1选项。
# 如果想要克隆名为1.0.0的标签的代码,可以执行以下命令:
git clone --branch 1.0.0 <repository_url> --depth 1
提交 Commit
相关
# 自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
git commit -a -m "master merge commit”
# 使当前提交中改动的内容为前一次提交(忘了改动内容的提交)中改动的内容。其中 --no-edit 表示不改变注释(Message),但是本来的属性会改变,例如注释的 ID 号
git commit --amend --no-edit
# 希望修改日期
git commit --amend --date "Mon Aug 1 12:23:11 2022 +0800"
# 修改最后一次提交的注释
git commit --amend
查询某个提交是在什么分支
# -l表示--list本地,-r表示--remotes远端,-a表示--all全部 # 查找本地对应的分支 git branch --contains xxxx git branch --contains xxxx -l git branch --contains xxxx --list # 查找远程的分支 git branch --contains xxxx -r git branch --contains xxxx --remotes # 查找本地与远程对应的分支,是否添加-r都可以 git branch --contains xxxx -a git branch --contains xxxx --all
合并多条 Commit
记录
# 合并最近提交的 3 条 commit;
git rebase -i HEAD~3
运行该指令之后,将会弹出一个新的编辑框要求你修改合并策略;例如
pick 9a9fd97 md 001 pick 3asfc32 md 002 pick ee61cc6 md 003
# pick 表示选择此次 commit 为合并后的 Commit ,squash 表示此commit为被合并的 Commit, 缩写为 s; # 修改如下:
pick 9a9fd97 md 001 & md 002 & md 003 s 3asfc32 md 002 s ee61cc6 md 003
# 修改完之后,wq 保存退出,则还将会弹出一个新的编辑框要求编写新的合并 Commit 信息; wq 保存退出后,则会合并commit; # 切忌不要 git pull # 因为合并的是远程已经push的commit,要应用合并,需强制push git push -f
将git仓库中所有的 commit 合成一个,清空所有 git 提交记录
拣选(引入其他分支中的特定提交)
# 将指定的提交 commitHash,应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样
git cherry-pick <commit ID>
# 转移该分支的最新一次提交
git cherry-pick 分支名
# 将 A 和 B 两个提交应用到当前分支。这会在当前分支生成两个对应的新提交
git cherry-pick <HashA> <HashB>
# 转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错,(提交 A 将不会包含在 Cherry pick 中)
git cherry-pick A..B
# 转移A到B的所有提交(包含A)
git cherry-pick A^..B
拣选 -- 冲突解决
1. 先将修改后的文件加入到暂存区: git add xxxx
2. 让cherry-pick继续执行此过程: git cherry-pick --continue
# 若放弃拣选,回到操作前的样子,可执行:
git cherry-pick --abort
# 若放弃拣选,且不回到操作前的样子
git cherry-pick --quit
版本管理
# 可以查看历史版本记录
git log
git log --oneline # 一行显示git记录
git log --oneline --all # 以一行的形式显示所有分支git记录
git log --oneline --all -4 --graph # 显示所有分支的版本演进的最近4条
git log -4 # 显示最近4条记录
git log --all # 显示所有分支的commit信息
git log --graph # 查看分支合并图
git log --graph --pretty=oneline --abbrev-commit # 查看分支合并概况
git log --grep="bug" # 根据 message 过滤 commit 显示
git --no-pager log # 一次性输出所有commit
git log --pretty=format:"%B" [commit ID] # 只显示 message
git log --pretty=format:"%H" [commit ID] # 只显示 commit ID
# 查看每一次操作记录
git reflog
git reflog –date=iso-strict # 同时显示日期和时间
# 默认回退上一个版本
git reset --hard
# 回退到上个版本
git reset --hard HEAD^
HEAD表示当前版版本
HEAD^表示上个版本
HEAD^^上上个版本
# 回退指定的版本
git reset --hard <版本id号>
分支管理
# 创建分支
git branch develop
# 创建仓库时,附带同时创建分支
git init -b dev
# 查看本地分支
git branch
# 查看分支信息
git branch -v
# 查看更详细的远程分支信息,包括最后的提交信息等
git remote show origin
# 查看远程分支,加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话)
git branch -a
# 切换分支
git checkout branch_name
# 删除本地分支
git branch -d branch_name
# 强制删除
git branch -D branch_name
# 新建并切换至新的分支
git checkout -b dev
# 基于远程 develop 分支建立本地 develop 分支
git checkout -b develop origin/develop
# 删除远程分支
git branch -r -d origin/branch-name
git push origin :branch-name
# 重命名分支
git branch -m <原名称> <新名称>
# 如果远程新建了一个分支,本地没有该分支, 这时本地会新建一个分支名叫 branch_name ,会自动跟踪远程的同名分支 branch_name
git checkout --track origin/branch_name
# 如果本地新建了一个分支 branch_name,但是在远程没有, 可以自动在远程创建一个 branch_name 分支,然后本地分支会 track 该分支。后面再对该分支使用 push 和 pull 就自动同步
git push --set-upstream origin branch_name
# 查看本地分支和远程分支存在的依赖关系
git branch -vv
# 新建分支,并与远程分支创建关联;前提是远程分支存在
git branch dev origin/dev
# 对本地已存在分支,添加远程分支关联关系
git branch --set-upstream-to=origin/<远程分支名称> <本地分支名称>
# 查看哪些分支已经合并到当前分支
git branch --merged
# 查看所有包含未合并工作的分支
git branch --no-merged
分支合并
# 方法001 -- 合并分支到当前分支 --- merge 操作
git merge <被合并分支名称>
git merge --no-ff A # 已创建新提交的方式合并 A 分支
git merge A --no-ff -m "merge A into master,test merge message" # 合并时且指定注释信息
# 方法002 --- 合并分支到当前分支 --- rebase 操作
git rebase <被合并分支名称> # 若要合并远程分支,则需先同步远程分支;git fetch master
# 如何有冲突,会暂停rebase,需要手动解决冲突, 然后继续 rebase
git rebase --continue
# 在任何时候,都可以终止rebase
git rebase --abort
----------------------------------------------------------
两者的区别在于:前者会在生成一条 Merge branch master into XXX 的commit记录,而后者能保持commit干净。
git rabase 在开源提交PR时,能够更好地保持commit 整洁,消除了多余的 Merge log
储藏区的 管理
# 保存暂存区工作区进度
git stash
# 保存暂存区工作区进度, 自定义储藏名
git stash save "my app01 stash"
# 查看stash保存的列表以及id
git stash list
# 恢复最新的 stash 进度到工作区
git stash pop
# 恢复指定的 stash 进度
git stash pop stash_id
# 清空所有存储的stash进度
git stash clear
# 默认删除第一个stash
git stash drop
# 删除一个存储的stash进度
git stash drop stash_id
# 恢复stash存储,且不删除stash list中的记录
git stash apply
# 注意:
1> 在应用完指定的 stash 后,若存在冲突,则在解决完冲突的文件后,还需执行如下步骤:
1. 添加修改后的文件:在解决冲突后,使用git add命令将修改后的文件添加到暂存区
2. 移除已应用的 stash:运行git stash drop stash@{stash索引}命令来移除已经应用的stash。
3. 提交修改:最后,通过git commit命令提交解决冲突后的修改。
2> 任意一个Stash都可在任意一个分支应用,只是需要关注冲突;
撤销修改
# 撤销暂存区的修改,unstage操作
git reset HEAD readme.txt
# 放弃工作区的修改操作, 撤销修改记录,只能在未提交到暂存区之前
git checkout -- readme.txt
# 撤销 git 追踪
git rm --cached <file>
主机【远程仓库】管理
# 添加远程主机
格式: git remote add <name> <url>
git remote add origin <URL>
# 查看远程主机信息,并且会列出和本地库的关系
git remote show origin
# 删除远程仓库
git remote rm name
# 修改仓库名
git remote rename <old_name> <new_name>
# 修改已有仓库的链接地址
git remote set-url origin https://gitee.com/holyking/test-3.git
# 显示所有远程仓库
git remote -v
代码推送
# 格式如下:
git push <远程主机名> <本地分支>:<远程分支>
# 若只关联一个主机,且本地分支和远程分支同名,则推动代码可简写为:
git push ## 等价与 git push origin dev:dev
# 自动将本地 origin 仓库的 master 分支与 远程仓库的 master 分支做关联,在之后推送则自动记住
git push -u origin "master"
# 强制推送
git push --force origin main
# 全部推送所有分支
git push --all origin
# 推送特定的多个分支
git push origin [分支名1:远程分支名1] [分支名2:远程分支名2] [分支名3:远程分支名3] …
# 推送标签
git push --tags origin
代码拉取
#从远程分支 dev 上下载代码,并且合并到本地所在的分支
git pull origin dev
# 拉取远程分支到本地,并自动创建本地分支,且将该分支代码自动合并当前所在分支
git pull origin yundoudou:yundoudou
# 拉取远程分支到本地,(已创建本地分支),但不合并到当前分支
git fetch 远程仓库别名 远程分支名
# 拉取远程分支到本地,且自动创建本地分支,且不合并
git checkout -b 本地分支名 远程仓库别名/远程分支名
# 强制拉取复位本地分支,和远程分支保持一致 ---- 这个贼重要,但前提要切换到当前分支,否则要合并;
git reset --hard origin/<branch_name>
修改 commit 的 message 信息
修改最后一次提交 commit 的信息
# 修改最近提交的 commit 信息
$ git commit --amend --message="modify message by daodaotest" --author="jiangliheng <jiang_liheng@163.com>"
# 仅修改 message 信息
$ git commit --amend --message="modify message by daodaotest"
# 仅修改 author 信息
$ git commit --amend --author="jiangliheng <jiang_liheng@163.com>"
修改历史提交 commit 的信息
# 列出 rebase 的 commit 列表,不包含 <commit id>
$ git rebase -i <commit id>
# 最近 3 条
$ git rebase -i HEAD~3
# 本地仓库没 push 到远程仓库的 commit 信息
$ git rebase -i
# vi 下,找到需要修改的 commit 记录,```pick``` 修改为 ```edit``` 或 ```e```,```:wq``` 保存退出
# 重复执行如下命令直到完成
$ git commit --amend --message="modify message by daodaotest" --author="jiangliheng <jiang_liheng@163.com>"
$ git rebase --continue
# 中间也可跳过或退出 rebase 模式
$ git rebase --skip
$ git rebase --abort
日志 log
相关
git log --oneline --decorate --graph --all
别名管理
别名查看与配置
# 查看已存在配置别名
# 别名设置语法
git config --global alias.de "checkout develop"
常用别名
ch = checkou
st = status
staust = 'gitst'
cf = config
ck = checkout
ft = fetch
fh = fetch
br = branch
brv = branch --v
geturl = config --get remote.origin.url
bs = bisect
lg = log
cfg = config --global
cfga = config --global alias.
pull = pl
pl = pull --rebase
cm = commit -c HEAD
ps = push
lsr = ls-remote --heads
udc = reset HEAD~
ftg = fetch --tags
am = commit -amend
cmd = commit --amend
rsh = reset HEAD~
cmi = commit --interactive -c HEAD --reset-author
i = --interactive
rss = reset --soft
rmc = rm --cached
cp = cherry-pick
cpx = cherry-pick -x
bl = blame
gk = gitk
ltn = ls-tree -r HEAD~ --name-only
lt = ls-tree -r HEAD~ --name-only
ltng = ls-tree -r HEAD~ --name-only |grep
lgd = log -p --full-diff
bcm = "branch -a --contains "
brc = branch -a --contains
tagc = tag --contains
标签管理
待......
https://blog.csdn.net/qq_39183034/article/details/129951955
解决冲突
# 处理Git冲突文件的步骤如下
1. 打开Git命令行界面,并进入包含冲突文件的Git仓库。
2. 运行 git status 命令,查看哪些文件发生了冲突。
3. 打开发生冲突的文件,查看冲突内容。冲突内容通常以以下格式出现:
<<<<<<< HEAD 代码库中的修改 ======= 开发者的修改 >>>>>>> branchname 其中,HEAD 表示代码库中的修改,branchname 表示开发者的修改。
4. 手动解决冲突,将代码库中的修改和开发者的修改合并到一起。解决冲突的方法包括选择某个修改,或者手动编辑以保留所需的更改。同时也需将冲突符号删除。
5. 保存修改后的文件,并运行 git add 命令将文件标记为已解决。
6. 运行 git commit 命令提交修改。
变基---- rebase
# 假设提交链表图如下:
master分支,节点链表指向为:c1<--c3<--c4
dev分支,节点链表指向为:c1<--c2<--c5
1. 切换到开发者分支 dev : git checkout dev
2. 将 dev 上的c2、c5在master分支上做一次衍合处理,
git rebase master
2.1> 若存在代码冲突,则需提前处理完毕
git add <冲突文件>
git rebase --continue # 得以让 rebase 继续处理
3. 切换到主分支 master : git checkout master
4. 开始合并 dev 分支: git merge dev
至此,合并后的 master 分支节点链表指向为: c1 <-- c3 <-- c4 <-- c2 <-- c5
回滚 --- revert
假设我们在开发过程中,发现某个提交引入了问题或者与预期的功能不符,我们则就需要将该提交从分支中移除, 即回滚;
# 回滚指定的提交
git revert <commit ID>
远程仓库管理
# 删除仓库
git remote remove origin
# 添加仓库
git remote add origin https://gitee.com/suosuo1930/git_repo_root.git
# 获取仓库地址
git remote get-url origin
# 修改仓库地址
git remote set-url origin https://gitee.com/suosuo1930/git_repo_roots.git
子模块 --- submodule
文件忽略 .gitignore
待......
https://www.cnblogs.com/FleetingAstral/p/15888167.html
元数据 .git
待......
Git 分支策略
其他
查询 2 个分支的提交区别
ISSUE
简单来讲就是正常的解决冲突过程是
1,git add .
2,git commit -m "..."
3,git push时因为本地仓库代码与远程仓代码有冲突,所以接下来
4,git pull拉取远程代码,而冲突需要手动解决
5,解决好后重新进行git add . ; git commit -m".." git push
1. 拉取时显示拒绝合并 refusing to merge unrelated histories
# 解决方案是:
在pull命令后紧接着使用 --allow-unrelated-histories 选项
原因:出现这个问题的最主要原因还是在于本地仓库和远程仓库实际上是独立的两个仓库
软件测试|Git:fatal: refusing to merge unrelated histories错误分析与解决
2. 拉取代码时换行符为 \r\n
问题
# 问题
core.autocrlf 参数默认为 true
# 解决方法 --- 设置为 false 即可
# 自动模式 ---- 配置 core.autocrlf 参数 如果你想要在提交时转换为LF,并在检出时不进行转换,可以设置为false 如果你想要在提交时转换换行符,并在检出时进行还原,可以设置为true 如果你想要在检出时不进行任何转换,可以设置为input # 手动模式 ---- 手动配置 .gitattributes 文件 * text=auto eol=crlf
3. 解决 git 在 Windows 下中文乱码问题
$ git config --global core.quotepath false # 设置显示 status 编码
$ git config --global gui.encoding utf-8 # 设置图形界面编码
$ git config --global i18n.commit.encoding utf-8 # 设置提交信息编码
$ git config --global i18n.logoutputencoding utf-8 # 设置输出 log 编码
电脑设置环境变量 : LESSCHARSET=utf-8
4. 在 VsCode PowerShell 下唯独 git status
下乱码
# 临时解决
执行命令: chcp 65001
# 永久解决
在项目或全局的配置文件: .vscode/settings.json 中新增如下配置:
{
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"icon": "terminal-powershell",
"args": [ // 启动终端时传入参数
"-NoExit",
"chcp 65001"
]
},
"Command Prompt": {
"path": [
"${env:windir}\\System32\\cmd.exe"
],
"args": [ // 启动终端时传入参数
"/k",
"chcp 65001"
],
"icon": "terminal-cmd"
}
},
"terminal.integrated.defaultProfile.windows": "PowerShell" // 这里可以选择默认的终端
}
5. 拉取远程分支并创建本地分支时报错说远程分支不存在,但实际存在
# 解决方法
git fetch origin # 效果与 git fetch origin maste 相同
这个命令会从远程仓库(通常命名为 "origin")中获取所有分支和标签的最新信息,但不会合并任何变更到你的本地分支。
它是获取远程仓库中所有分支和标签的快捷方式,让你可以查看其他人在远程仓库中的工作状态
若要拉取特定分支的最新信息,且不合并任何代码到本地分支,可执行如下命令:
git fetch <分支名>
总体来说,git fetch 是用来从远程仓库获取信息的,但不自动合并到本地分支。取决于你的目的,你可以选择获取整个远程仓库的信息,或者只获取特定分支的信息。
6. 解决 git log
中时间显示格式不为中国人习惯的问题
# 解决方案
git config --global log.date iso8601 # 直接全局设置