Git 命令整理

基础
git init:初始化一个 Git 版本库git add <file>:把文件添加到仓库git add -f <file>:强制添加文件
git commit:把文件提交到仓库;-m "xxx":提交说明git status:显示工作区状态git diff:查看修改内容git log:显示提交日志--pretty=oneline:更简洁地显示日志
git reset --hard commit_id:回退到历史版本git reflog: 查看命令历史git diff HEAD -- <file>:查看工作区和版本库里面最新版文件的区别git checkout -- <file>:丢弃工作区的修改git reset HEAD <file>:把暂存区的修改撤销掉,重新放回工作区rm <file>,git rm <file>:删除文件git check-ignore -v <file>:检查.gitignore规则哪里写错
远程仓库
ssh-keygen -t rsa -C "youreamil@example.com"创建 SSH Key
用户主目录下会创建.ssh目录,里面有id_rsa和id_rsa.pub两个文件。id_rsa是私钥,id_rsa.pub是公钥。git remote add origin git@github.com:xxx/xxx.git
链接远程仓库,远程库的名字是origin。git push -u origin master
-u会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。git push origin mastergit clone git@github.com:xxx/xxx.git
克隆一个本地库。git remote:查看远程库的信息,-v显示更详细的信息git push origin <name>:推送分支git pull:抓取远程的新提交git checkout -b <branch_name> origin/<branch_name>:创建远程origin的<branch_name>分支到本地git branch --set-upstream-to=origin/<branch_name> <branch_name>:创建本地<branch_name>分支和远程<branch_name>分支的链接关系git push <remotename> <commit SHA>:<remotebranchname>:推送特定提交
分支管理
git checkout -b <name>:创建name分支,相当于git branch <name>和git checkout <name>两条命令git branch:查看当前分支git checkout <name>:切换分支,或使用git switch <name>git merge <name>:合并指定 xxx 分支到当前分支。通常 Git 会用 Fast Forward 模式,但这种模式下删除分支后会丢掉分支信息。git branch -d <name>:删除分支git branch -D <name>:强行删除,如果要丢弃一个没有被合并过的分支git branch -m <old> <new>: 分支重命名git log --graph --pretty=oneline --abbrev-commit:查看分支合并图git merge --no-ff -m "<info>" <name>:禁用Fast forward模式,合并分支时生成一个新的 commit,可以从分支历史上看出分支信息。git stash:保存当前工作状态git stash list:查看工作现场存储git stash apply:恢复工作状态,stash 内容不删除git stash apply stash@{?}:恢复指定的 stashgit stash clear:清除所有内容git stash drop:删除 stash 内容git stash pop:恢复工作状态并删除 stash 内容git rebase:把本地未 push 的分叉提交历史整理成直线git push --all origin:推送所有分支
标签管理
git tag <tag-name>:打标签,-a指定标签名,-m指定说明文字,-s用私钥签名一个标签。默认标签是打在最新提交的 commit 上的。git tag <tag-name> <commit id>:给历史提交打标签git tag:查看所有标签git show <tag-name>:查看标签信息- 标签总是和某个 commit 挂钩。如果这个 commit 既出现在 master 分支,又出现在 dev 分支,那么这两个分支上都可以看到这个标签。
git tag -d <tag-name>:删除本地标签git push origin <tagname>:推送标签到远程git push origin --tags:推送全部尚未推送到远程的本地标签git push origin :refs/tags/<tag-name>:删除远程标签
自定义 Git
- 每个仓库的 Git 配置文件存放在
.git/config文件中,当前用户的 Git 配置文件放在用户主目录下的.gitconfig中 git config --global user.name "your name":设定名字git config --global user.email "email@example.com":设定邮箱git config --global core.editor vim: 设置默认编辑器git config --global color.ui true:让 Git 显示颜色git config --global alias.xx xxxxx:配置别名git config --global init.defaultBranch <name>:自定义初始分支名称git config --list:查看已经有的配置信息
Git Large File Storage
安装
1
sudo apt install git-lfs
验证安装成功
1
2$ git lfs install
> Git LFS initialized.将仓库中的文件类型与 Git LFS 相关联
1
2$ git lfs track "*.psd"
> Adding path *.psd将本地
.gitattributes文件提交到仓库中将文件添加到与关联的扩展名相匹配的仓库
1
git add path/to/file.psd
其它
git push -u origin master 中 -u 的含义
来自文档中的解释:
1
2
3
4-u, --set-upstream
For every branch that is up to date or successfully pushed,
add upstream (tracking) reference, used by argument-less git-pull(1)
and other commands.当在一个分支中使用
git pull时,如果没有指定一个远程分支,git 会寻找branch.<name>.merge设置来了解从何处 pull。所以
-u用来设置本地与远程分支之间的联系。1
git push -u origin master
应该与下面的命令相同:
1
2git push origin master
git branch --set-upstream master origin/master设置完成后就可以直接使用
git pull来代替git pull origin master。
合并多个 Commit
在使用 Git 作为版本控制的时候,我们可能会由于各种各样的原因提交了许多临时的 commit,而这些 commit 拼接起来才是完整的任务。那么我们为了避免太多的 commit 而造成版本控制的混乱,通常我们推荐将这些 commit 合并成一个。
查看提交历史
首先你要知道自己想合并的是哪几个提交,可以使用 git log 命令来查看提交历史,假如最近 4 条历史如下:
1 | commit 3ca6ec340edc66df13423f36f52919dfa3...... |
历史记录是按照时间排序的,时间近的排在前面。
git rebase
想要合并 1 - 3 条,有两个方法
从 HEAD 版本开始往过去数 3 个版本
1
git rebase -i HEAD~3
指名要合并的版本之前的版本号
1
git rebase -i 3a4226b
请注意
3a4226b这个版本是不参与合并的,可以把它当做一个坐标。
选取要合并的提交
执行了
rebase命令之后,会弹出一个窗口,头几行如下:1
2
3
4
5pick 3ca6ec3 '注释**********'
pick 1b40566 '注释*********'
pick 53f244a '注释**********'将
pick改为squash或者s,之后保存并关闭文本编辑窗口即可。改完之后文本内容如下:1
2
3
4
5pick 3ca6ec3 '注释**********'
s 1b40566 '注释*********'
s 53f244a '注释**********'然后保存退出,Git 会压缩提交历史,如果有冲突,需要修改,修改的时候要注意,保留最新的历史,不然我们的修改就丢弃了。修改以后要记得敲下面的命令:
1
2git add .
git rebase --continue如果你想放弃这次压缩的话,执行以下命令:
1
git rebase --abort
如果没有冲突,或者冲突已经解决,则会出现如下的编辑窗口:
1
2
3
4
5
6
7
8# This is a combination of 4 commits.
#The first commit’s message is:
注释......
# The 2nd commit’s message is:
注释......
# The 3rd commit’s message is:
注释......
# Please enter the commit message for your changes. Lines starting # with ‘#’ will be ignored, and an empty message aborts the commit.输入
wq保存并退出,再次输入git log查看 commit 历史信息,你会发现这两个 commit 已经合并了。
将一个分支推送到新的仓库
如果想将一个仓库中原有的分支转换为新的远程仓库,可以执行如下操作:
1 | git push url://to/new/repository.git branch-to-move:new-branch-name |
重命名 master 分支为 main
Github 上重命名 master 分支为 main 分支,本地仓库设置:
1 | git branch -m master main |
删除远程仓库中已存在的文件或文件夹
如果需要在远程仓库中忽略已经纳入版本管理的文件或文件夹,可以这样操作:
删除本地 git 缓存
1
git rm -r --cached <filename>
在
.gitignore中加入需要忽略的文件或文件夹重新追踪文件
1
2git add .
git commit -m "remove files"推送到远程仓库
Convert a git repository to a shallow repository
1 | git pull --depth 1 |
批量修改提交中的邮箱信息
需要用到 git-filter-repo 的 CALLBACKS 功能
1 | # 安装 |
修改历史提交信息
git commit --amend 用于修改上次提交信息。
git 使用 amend 选项提供了最后一次 commit 的反悔。但是对于历史提交呢,就必须使用 rebase 了。
git rebase -i HEAD~3:如果你要修改哪个,就把那行的pick改成edit,然后保存退出。- 这时通过
git log你可以发现,git 的最后一次提交已经变成你选的那个了,这时再使用:git commit --amend - 修改完了之后,要回来使用
git rebase --continue
仓库迁移
如果将项目从 Gitlab 迁移到 Github 上,可以进行如下操作:
- 进入
.git文件夹下,打开config文件 - 修改
remote "origin"分类下的url字段,更改为 Github 仓库地址 - 重新推送,即
git push origin master