Git 使用笔记
记录了一些常用git命令
命令
shell
git init
git config -e # 编辑配置文件
git config user.name 'username'
git config user.email 'email'
git clone [-b] branch xxx.git 拉取
git status
git log [-p]/[-n] ---n代表数字
git log --stat ---简单信息
git log --name-status ---可以显示新增、修改、删除的文件清单
git log dev ^master # 查看dev分支有的,master分支没有的提交
git log master..dev # 查看dev比master分支多了哪些提交
git log --left-right dev...master # 查看不一致的提交;commit 后面的箭头,根据我们在 –left-right dev…master 的顺序,左箭头 < 表示是 dev 的,右箭头 > 表示是 master的
git log filename #查看某个文件的提交记录
git log -p filename #查看某个文件提交的diff
git log --pretty=oneline #列出某个文件的所有改动历史
git show <提交hash>filename # 查看某次提交的文件变化
git commit [-m '']
git push [--set-upstream/-u] <远程主机名> [<本地分支名>:]<远程分支名>
git push origin :refs/tags/test_tag //本地tag删除了,再执行该句,删除线上tag
git push origin :<tag>/<branch> 删除远程tag/分支
git pull 远程 本地
git pull origin 1.x:dev 将远程origin的1.x分支拉取到本地dev分支
git push origin dev:1.x 将本地dev分支推送到远程1.x分支
git fetch origin test:example fetch远程test到本地example(原本不存在)
git tag test_tag c809ddbf83939a89659e51dc2a5fe183af384233 //在某个commit 上打tag
git tag [tag] 新建或者list tag
git tag -d <tag> 删除本地tag
git remote add origin https://git.com
git remote set-url origin https://<token>@github.com/<username>/<repo>.git
git remote set-url --add origin https://<token>@github.com/<username>/<repo>.git # 添加多个
git remote get-url origin
git remote -v # 列出所有
git remote rename 原名 新名
git remote remove 名字
git add xx命令可以将xx文件添加到暂存区,如果有很多改动可以通过 git add -A .来一次添加所有改变的文件。注意 -A 选项后面还有一个句点。 git add -A表示添加所有内容, git add . 表示添加新文件和编辑过的文件不包括删除的文件; git add -u 表示添加编辑或者删除的文件,不包括新添加的文件
git commit -m "提交注释"
git branch 查看本地所有分支
git branch -r查看远程所有分支 一般当前本地分支前带有“*”号且为绿色,远程分支为红色
git branch -a
git branch -vv
git branch [-f] <branchname> 新建分支但是不切换
git branch -d[-D] <branchname>删除本地分支[强制(相当于 --delete --force)]
git branch -d -r <branchname>删除远程分支,其中<branchname>为本地分支名
git branch (-m | -M) <oldbranch><newbranch> //修改branch名称
git switch # git2.23+ 和 git checkout 相同
git switch -c # 和git checkout -b 相同
git checkout -b <branchname> 新建并切换至新分支
git checkout -b dev origin/dev 切换到远程分支origin/dev
git branch --set-upstream 本地关联远程分支
git remote rm
git config --global core.autocrlf false 禁用Git默认配置替换回车换行成统一的CRLF
git diff dev # 比较当前分支和dev分支的差异
git diff dev master # 比较dev和master分支差异
git diff <源分支> <目标分支> -- <文件路径/目录> # 比较单个文件或者目录
git diff <commit1> <commit2> -- <文件路径> # 比较提交记录中的文件
git diff HEAD^ HEAD -- app.js # 我们要比较HEAD和前一个提交中app.js文件的差异
git diff 分支1 分支2 --stat (加上 --stat 是显示文件列表, 否则是文件内容diff)
git cherry-pick <commithash> 将commitHash的提交应用于当前分支
git cherry-pick <branch> 会转移该分支的最新一次提交
git cherry-pick <hash1><hash2> 转移这两次提交
git cherry-pick <hash1>..<hash10> 转移hash1到hash10的提交(hash1必须比hash10早,默认不包含1, 如果要包含,需要<hash1>, 例如:git cherry-pick A^..B )
git merge --abort # 取消merge
git merge --no-ff <branch> # 合并,在 目标分支 上就会有合并记录
git restore [--worktree] aaa # 从staged中恢复aaa到worktree
git restore --staged aaa # 从repo中恢复aaa到staged
git restore --staged --worktree aaa # 从repo中恢复aaa到staged和worktree
git restore --source dev aaa # 从指定commit中恢复aaa到worktree
git revert -n <hash>
更多cherry-pick用法可以参考:https://ruanyifeng.com/blog/2020/04/git-cherry-pick.html 或者官方文档
git cherry-pick --help
清除添加但是未添加到工作区的文件
git clean
-n 并不删除操作,只显示将被清理的文件列表
-f 删除文件,但不会动.gitignore里标记的
-d 删除目录,但不会动.gitignore里标记的
-X 仅删除.gitignore里标记的文件
选项
-d --delete:删除
-D --delete --force的快捷键
-f --force:强制
-m --move:移动或重命名
-M --move --force的快捷键
-r --remote:远程
-a --all:所有
恢复到之前的文件
对于恢复修改的文件,就是将文件从仓库中拉到本地工作区,即 仓库区 ----> 暂存区 ----> 工作区。
对于修改的文件有两种情况:
-
只是修改了文件,没有任何 git 操作
-
修改了文件,并提交到暂存区(即编辑之后,gitadd但没有gitadd但没有 git commit -m ....)
-
修改了文件,并提交到仓库区(即编辑之后,gitadd和gitadd和 git commit -m ....)
情况I:
只是修改了文件,没有任何 git 操作,直接一个命令就可回退:
git checkout -- aaa.txt
git checkout . # 放弃全部修改
情况II:
修改了文件,并提交到暂存区(即编辑之后,gitadd但没有 git commit -m ....)
git log --oneline # 可以省略
git reset HEAD # 回退到当前版本
git checkout -- aaa.txt # aaa.txt为文件名
git checkout -- * # 恢复所有
其中
-
HEAD^就是表示上一个版本
-
HEAD^^就是表示上上一个版本
-
HEAD~100就是往上100个版本
情况III:
修改了文件,并提交到仓库区(即编辑之后,gitadd和gitadd和 git commit -m ....)
git log --oneline # 可以省略
git reset HEAD^ # 回退到上一个版本
git checkout -- aaa.txt # aaa.txt为文件名
情况II 和 情况III 只有回退的版本不一样,
对于 情况II,并没有 git commit,仓库版本也就不会更新和记录,所以回退的是当前版本
对于情况III,一旦 git commit,仓库版本就会更新并记录,所以要回退的也就是上一个版本
git reset 版本号 ---- 将暂缓区回退到指定版本
根据 git log --oneline 显示的版本号(下图黄色的字),可以回退到任何一个版本,也可通过 HEAD 来指定版本(下图红色的字)。
git reset --hard # 如果删除了,没提交,可以用这条命令恢复
删除已经add的文件
git rm --cached ,不删除物理文件,仅将该文件从缓存中删除;
git rm --f ,不仅将该文件从缓存中删除,还会将物理文件删除(不会回收到垃圾桶)。
git reset HEAD 用版本库内容清空暂存区,(谨慎使用)
配置ssh后还需要输入密码
只有git协议才可以使用ssh-keys文件,所以需要更改url
git remote set-url origin git@github.com:marxphp/simple.git
恢复版本
shell
git reset HEAD
git reset [--hard] <commit number> # 加上--hard后修改将会被移除,而不是在暂存区
【Git】pull遇到错误:error: Your local changes to the following files would be overwritten by merge:
原因:git merge时本地分支的更改没有保存下来。
本篇记录git merge时的一个报错error: Your local changes to the following files would be overwritten by merge,出现的原因是git merge时本地分支的更改没有保存下来。
解决方法分为两种。
方法一,丢弃本地改动
如果本地的修改不重要,那么可以直接把本地的的修改丢弃:
丢弃所有本地未提交的修改
shell
git checkout . # 检查来确保不会将已更改的文件弄丢
git reset --hard # 不做检查就全面地替换所有东西
有的本地文件是新添加但没有add过的,在git status中的状态是untrack,它们需要通过git clean删除:
首先查看一下有哪些文件将被删除
shell
git clean -nxdf
确定将被删除的文件无误后,执行删除
shell
git clean -xdf
也可以一个一个文件的删除,比如删除文件xxx
shell
git clean -f xxx
注意:丢弃本地文件是危险操作,必须考虑无误后再删除。
方法二,暂存到堆栈区
如果本地的修改重要。后续需要用到,那么可以把当前的修改暂存到堆栈区:
暂存到堆栈区
shell
git stash # 全部
git stash push temp.c # 单个文件
git stash -- temp.c # 单个文件
git stash push -m "test" temp.c
git stash save "test" # 描述是test
查看stash内容
shell
git stash list
内容如下:
stash@{0}: On v1.0: 描述
stash@{1}: WIP on dev: 46761a9bc Fix: 描述
要用到本地修改时,把stash内容应用到本地分支上:
shell
git stash pop
stash中的内容被弹出。如果保存了多个暂存内容,那么弹出顺序是先进后出的(栈)。
如果不想弹出内容,但仍然把stash内容应用到本地分支上:
shell
git stash apply [index] # 可以取出对应index的修改
这样stash中的内容不会被弹出。
此外,可以手动删除stash中的内容:
删除指定的一次stash内容,名称可以通过git stash list获得
shell
git stash drop stash@{index}
删除所有stash内容
shell
git stash clear
注意:使用git stash暂存内容后merge,再git stash pop,可能报分支冲突,此时可以在本地新建一个分支,在新分支上恢复stash内容。
队协作中常用术语 WIP PTAL CC LGTM
-
WIP Work in progress, do not merge yet. // 开发中
-
LGTM Looks good to me. // Riview 完别人的 PR ,没有问题
-
PTAL Please take a look. // 帮我看下,一般都是请别人 review 自己的 PR
-
CC Carbon copy // 一般代表抄送别人的意思
-
RFC — request for comments. // 我觉得这个想法很好, 我们来一起讨论下
-
IIRC — if I recall correctly. // 如果我没记错
-
ACK — acknowledgement. // 我确认了或者我接受了,我承认了
-
NACK/NAK — negative acknowledgement. // 我不同意
软件的Alpha、Beta、GM、OEM、LTS等版本的含义
常用版本号:
Alpha:软件或系统的内部测试版本,会有很多Bug,仅内部人员使用
Beta:软件或系统的测试版本,这一版本通常是在Alpha版本后,会有很多新功能,同时也有不少Bug
Gamma:软件或系统接近于成熟的版本,只需要做一些小的改进就能发行
微软常用的版本号:
RC(Release Candidate):候选版本,这一版本不会增加新功能,多要进行Debug
GA(General Available):正式发布版本,这个版本就是正式的版本
RTM(Release to Manufacture):给工厂大量生产的压片版本,与正式版内容一样
OEM(Original Entrusted Manufacture):给计算机厂商的出场销售版本,不零售只预装
RVL:号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的
EVAL:而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别
RTL(Retail):零售版是真正的正式版,正式上架零售版
苹果常用的版本号:
GM(Gold Master):正式版前最后一个测试版,其实也就是正式版
谷歌Chrome浏览器常用的版本号:
Chromium:开源版本,迭代速度极快,数小时就会有新版本,有很多新功能,等待验证后会移植到Chrome
Canary:迭代速度相对于Chromium版稍慢一些,功能非常新但未经过验证,同时崩溃的概率非常高
Dev:基于Chromium开发,每周出新功能,并且这些功能还有一定的筛选,另外还修复了一些Bug和不稳定因素
Beta:基于Dev版,Chrome会基于这一版本进行改进,一般按月更新,功能更加完善
Stable:稳定版本,也就是Chrome的正式版本,这一版本基于Beta版,已知Bug都被修复,一般情况下,更新比较慢
Ubuntu系统常用的版本号:
LTS(Long Term Support):长期演进版,Ubuntu会对这一版本的支持时间更长。目前Java也在运用这种方式
参考地址: https://blog.csdn.net/qq_36761831/article/details/83188138
Git diff提示 filemode变化 old mode 100644、new mode 10075
shell
git config [--global ] core.filemode false
如果您需要在Git URI中指定用户名和密码,您可以使用以下格式:
ssh://username:password@hostname/path/to/repository
请注意,这种方法不太安全,因为密码以明文形式出现在URI中。如果可能的话,建议您使用SSH密钥进行身份验证。
如果您不想在URI中使用明文密码,您可以考虑使用SSH密钥进行身份验证,或者使用HTTP协议进行Git推送,并在推送时提供用户名和密码。以下是HTTP协议的示例URI格式:
http://username:password@hostname/path/to/repository
请注意,使用HTTP协议进行Git推送也不太安全,因为用户名和密码以明文形式出现在URI中。如果可能的话,建议您使用SSH密钥进行身份验证。
git lfs
详解 Git 大文件存储(Git LFS) - 知乎 (zhihu.com)
shell
git lfs install
git lfs fetch
git lfs checkout
git配置
git config pull.rebase false
git config pull.ff only