Git 使用笔记

2022/4/8·3 views

图解git flow开发流程

记录了一些常用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  # 不做检查就全面地替换所有东西

git checkout 和 git reset 的区别 —— Git 学习笔记 09_git reset --hard commitkey 和 git checkout commitke-CSDN博客

有的本地文件是新添加但没有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