个人整理的一些常用的 Git 概念和命令集合,方便速查和快速解决某些场景下的问题,覆盖了日常开发和协同工作下的一部分场景,不只是命令行的介绍。
精简入门 1、克隆仓库 克隆仓库会下载仓库完整的文件、分支和历史记录。
1 git clone [<options>] [-- ] < repo> [<dir>]
1 2 3 4 git clone git @github.com:x-cold/git-learning.git git clone -b dev git@github.com:x-cold/git-learning.git dev
2、将文件变更记录写入到本地的索引库
1 2 3 4 git add . git add src/ app/ index.js
3、提交变更到工作区
1 git commit [<options >] [
1 2 3 4 5 6 # 最普通的提交 git commit - m "feat: support canvas" # 修改当前的 commit message git commit # 重置当前的 commit author 和 message git commit
4、推送代码到远程仓库
1 git push [<options > ] [<repository > [<refspec > ...]]
1 2 3 4 git push origin master # 提交本地仓库 dev 分支到远程的 master 分支 git push origin master :dev
聊聊设计 Git 是一个分布式的版本控制工具,因此远程和本地可以视为两个独立的 Git 仓库。上图是一张经典的 Git 中的数据流与存储级别的介绍,其中储存级别主要包含几部分:
工作区 (Working Files),指的是我们时刻在编辑的文件的目录,通常来说我们修改文件都是在工作区体现的 暂存区(Stage),暂存将本地的修改,然后提交到本地仓库 本地仓库(Local) 远程仓库(Remote) 由此不难看出整体的数据流动,就是一条从:工作区 -> 暂存区 -> 本地仓库 -> 远程仓库 的双向数据流通道。
常用命令 git init 创建一个空白的 git 仓库
git add git commit 1 git commit [<options >] [
git remote remote 指的是本地的 git 仓库关联的远程 git 仓库。 1、查看远程仓库信息
2、看远程仓库详细信息
3、删除远程仓库
1 git remote remove <name>
1 2 # 移除名字为 origin 的远程仓库 git remote remove origin
4、添加远程仓库
1 git remote add [-t <branch> ] [-m <master> ] [-f ] [--tags | --no -tags ] [--mirror=<fetch|push>] <name> <url>
1 git remote origin git@github.com :x -cold /git-learning.git
git branch 1、列出本地存在的分支
2、列出远程分支
3、列出本地和远程分支
4、创建本地分支
1 git branch [branchName] (remoteBranch)
1 2 git branch feature/canvas dev
5、分支重命名
1 git branch [<options>] (- m | - M) [<old-branch>] < new - branch>
1 2 # 修改 feature /canvas 分支名为 feature /canvas2 git branch -M feature /canvas feature /canvas2
6、删除本地分支
1 git branch - d | -D [branchName]
7、删除远程分支
1 git branch [<options>] [-r] (-d | -D ) <branch-name>.
1 2 git branch -d feature/canvas2
8、设置默认上游及分支
1 git branch --set -upstream <localBranch> <remote> /<remoteBranch>
1 2 # 以后只需要在 dev 分支执行 git push (无需额外的参数) 就可以提交到 origin/dev git branch --set -upstream dev origin/dev
git checkout 检出分支:
1 git checkout [<options > ] <branch >
1 2 3 4 # 切换当前分支到 dev 分支 git checkout dev # 基于当前分支创建 test 分支,并且将当前分支切换到 test 分支 git checkout -b test
除开用于分支切换,checkout 还可以用于恢复未添加到本地工作区,但是被修改过的文件。 **
1 2 # 将 index .js 恢复到当前 commit 的内容 git checkout index .js
git merge 合并分支:
1 git merge [<options > ] [<commit > ...]
1 2 git merge origin/master
git rebase 变基,是一种常用且有风险的操作,会改变提交历史,谨慎使用!
1 2 3 4 5 6 7 8 9 git rebase while (存在冲突 ) { git status 找到当前冲突文件,编辑解决冲突 git add -u git rebase --continue if ( git rebase --abort ) break ;}
git cherry-pick 魔法级的命令,cherry-pick 可以提取 N 个的提交记录,合入稳定版本的分支上。
1 git cherry-pick [<options > ] <commit-ish > ...
1 2 3 4 git cherry-pick 371 c2git cherry-pick 371 c2…971209
git push 推送到远程仓库,同步本地仓库的提交历史到远程仓库
1 git push [<options > ] [<repository > [<refspec > ...]]
1 2 3 4 5 6 7 8 git push origin master # 提交本地仓库 dev 分支到远程的 master 分支 git push origin master :devgit push origin publish/1.0 .0 git push origin --tags
git pull 拉取远程分支,同步远程仓库的提交历史到本地仓库
1 git pull [<options > ] [<repository > [<refspec > ...]]
1 2 3 4 5 6 7 git pull origin master # 也可以通过变基的方式来拉取代码,这样分支模型不容易受到影响 # 下面这行命令等同于 git fetch origin master && git rebase origin/master git pull --rebase origin master
git tag 1、创建 tag
2、查看 tag
3、推送到远程
4、删除本地 tag
5、删除远程 tag
1 git push origin :refs/tags/v1 .0.0
.git 仓库元数据 每一个 git 的代码仓库目录下,都会有一个 .git 的文件夹,其中包含的重要文件包含以下:
文件/文件夹 含义 config* 配置文件 description 描述,仅供 Git Web 程序使用 HEAD 当前被检出的分支 index 暂存区信息 hooks/ 客户端或服务端的钩子脚本(hook scripts) info/ 全局性排除(global exclude)文件,不希望被记录在 .gitignore 文件中的忽略模式(ignored patterns) objects/ 所有数据内容 refs/ 数据(分支)的提交对象的指针
进阶技巧 修改 commit 历史 使用 git rebase 进行历史修改,假定修改最近 3 条历史,操作步骤如下: 1、git rebase -i HEAD~3 运行此命令会提供一个提交列表,如下所示,其中 commit 记录是时间逆序排列的;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 pick f7f3f6d changed my name a bit pick 310154 e updated README formatting and added blame pick a5f4a0d added cat-file pick a5f412a0d added cat-file1 :2 , 4 s/pick/s/g
2、编辑上述列表文件,在需要更改的 commit 前,将 pick 修改为 edit ,如果需要压缩,可设置为 squash 保存退出,进入到 rebase 流程; 3、通过 git commit –amend –author 对历史记录依次修改和持续进行 rebase;
添加指定文件 1 git ls -files src/ | grep '\.css$' | xargs git add
删除所有 commit 中的某些文件 1 2 3 4 5 git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch -r build' --prune-empty --tag-name-filter cat -- --all git reflog expire --expire=now --all && git gc --prune=now --aggressive
git stash 使用 stash 可以将当工作区更改的临时存放起来,等一番 git 操作(比如 merge / rebase 等)之后,再将这部分更改重新放回工作区。
1 2 3 4 # 临时存放,临时存放区是一个栈的结构,支持多次临时存放,遵循后入先出的原则 git stash # 重新放回到工作区 git stash pop
附录