title: Git常用命令学习记录
date: 2015-10-21 15:52:09
tags: [git,版本控制,代码仓库]
categories: git
面试时被问起 git rease 运用场景,以及 git 为什么切换分支比 svn 快,一脸懵逼。其实之前有看过很多相关的 git 教程,但很少知其所以然。好记性不如烂笔头,最直接有效的方式就是自己总结加深记忆,固重新整理 git 命令记录备忘!
常用命令
熟练使用以下 git 命令,就足够应付工作中大部分场景。
需求熟练度:90%
git init
初始化本地仓库,会在当前目录生成 .git,里面包含:配置、分支、提交记录等信息。
git add
添加修改记录到缓存区。一般使用:
git add .
git add *
git rm
从索引中删除文件,默认并不会物理删除本地文件。一般用如下2个参数:
- git rm -f 1.txt 强制删除索引记录,以及本地文件。
- git rm --cached 1.txt 删除索引记录,但不删除本地文件。
git commit
提交修改记录到本地仓库:
git commit -m "[fix-bug]修复xxx问题"
修改最后一次提交的 commit 信息:
git commit --amend
git log
查看当前分支的所有历史提交记录,可加上 -n 过滤最近几条记录:
git log -n 3
如果要查看最近几条记录的修改详情,可使用:
git log -p -2
git show
查看某次 commit 修改详情,与上一个 git log -p -2 作用类似,常用命令。
git show 2ab46962b2395653b30871375159610485fd1244
git status
此命令应该是使用率最高的命令了,没有之一。
查看当前仓库状态,如果是有修改或者 add 的文件,都会显示相应的文件路径。如:
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: 1.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
libs/armeabi/ tmp/
- 1.txt 是 git add 之后,保存在暂存区
- libs/armeabi/和 tmp 是修改,但未追踪的文件目录
git branch
git 分支管理:
- 查看本地分支
```shellgit branch 等价于git branch --list
➜ gitTest git:(master) ✗ git branch master
dev```查看远程分支
git branch -r:显示对应的远程分支 git branch -a:显示本地和对应的远程分支
新建分支
git branch fixbug:基于当前分支,新建分支 fixbug git checkout -b fixbug:会自动切换到 fixbug 分支
修改分支名
git branch -m dev release
删除分支
删除本地分支
git branch -d/-D dev git branch |grep 'branchName' |xargs git branch -D #通过 grep 匹配分支,批量删除
删除远程分支
git checkout
切换分支或恢复修改但未 commit的文件。
git checkout dev #切换 dev 分支
git checkout -b dev # 基于当前分支,新建并切换到分支 dev
如果不小心删除了文件,可以使用如下恢复:
rm 1.txt
git checkout 1.txt # 检出索引中的1.txt,前提是1.txt被添加到索引跟踪了
如果大面积修改了某个文件,又想丢弃恢复到原来状态:
git checkout -- 1.txt
git clone
第一次下载远程代码,初始化到本地:
git clone https://coding.net/xxx.git # https
#或
git clone git@git.coding.net:xxx.git # ssh
如果远程仓库太大,clone 不下来,参考:4.拉取大仓库
git fetch
同步远程分支信息到本地。
git fetch
#或
git fetch -p
#或
git fetch origin dev:dev #拉取远程 dev,同时创建本地 dev,但不会自动 checkout
注:理解 fetch 的同时,需要理解 FETCH_HEAD
git pull
拉取远程分支并合并到当前分支。
git pull
#或
git pull origin dev
注:pull 等价于 fetch + merge,如果当前分支和拉取的分支不一致时,不建议直接使用 pull,因为会自动合并,不可控,慎用git pull
git push
推送本地提交到远程分支。
git push
#或
git push origin dev
git config
全局的用户配置:
git config --global user.name "xxx" git config --global user.email "xxx"
2. 取消全局的用户配置:
``` shell
git config --global --unset user.name git config --global --unset user.email
针对指定项目设置用户名和邮箱:
git config user.name "xxx" git config user.email "xxx"
相当于在项目根目录.git/config 文件中增加配置:
[user] name = xxx email = xxx
进阶命令
遇到一些疑难杂症,复杂场景,配合以下命令来解决。
需求熟练度:70%
git reset
git rebase
git merge
git cherry-pick
git tag
git diff
git remote
对远程仓库的管理操作指令,常用的有:
查看远程仓库地址
修改远程仓库地址
git stash
用于保存当前工作到暂存区,以压栈形式,可保存多个。在切换分支时,有文件改动,又不想丢弃合并,该指令非常有用。子命令有:
➜ app git:(aios-release-3.2-zhixingchanglian-2mic) git stash
--include-untracked -u -- include untracked files --keep-index -- all changes already added to the index are left intact --no-keep-index -- all changes already added to the index are undone --patch -- interactively select hunks from diff between HEAD and working tree to s
--quiet -q -- suppress all output apply -- apply the changes recorded in the stash
branch -- branch off at the commit at which the stash was originally created
clear -- remove all the stashed states
create -- create a stash without storing it in the ref namespace
drop -- remove a single stashed state from the stash list
list -- list the stashes that you currently have
pop -- remove and apply a single stashed state from the stash list
save -- save your local modifications to a new stash
show -- show the changes recorded in the stash as a diff
常用的有子命令有:
- git stash list,查看当前暂存区列表
- git stash save "xxxx",暂存时的备注信息
- git stash pop stash@{1} ,恢复第2个暂存区,默认第一个
高级命令
掌握以上命令,接下来就是针对各种复杂场景结合很参数来解决问题了,目前这些我也不够深入,待补充。
git submodule
待补充
git 原理
git 是目前最主流的分布式版本控制系统,在很早之前,大家用的最多的是 SVN —集中式的版本控制系统。他们俩有啥区别么?
git 和 svn 区别
- 文件存储上,比 svn 多一个暂存区,方便随时取消操作,不会产生记录。
存储 | git | svn |
---|---|---|
本地暂存区 | add | |
本地仓库 | commit | add |
远程仓库 | push | commit |
- 分布式和集中式
目录结构
前面讲到,通过 git init 初始化本地仓库,会生成 .git 目录,结构如下:
.git
├── COMMIT_EDITMSG ├── HEAD
├── config
├── description
├── hooks
├── index
├── info
├── logs
├── objects
└── refs
暂存区
本地仓库
远程仓库
问题记录
1. 与远程仓库同步
这里可能包含2种情况:
- 如果本地仓库不存在,相信大家都知道怎么做。直接 git clone 即可,本地与远程仓库就已保持同步。
- 如果本地仓库已存在,然后才新建远程仓库。此时假设远程仓库有默认生成 README.md 之类的文件,直接 git push 肯定会报错。
- 首先关联远程仓库:
2. 修改远程地址
- https 改成 ssh
git remote set-url origin git@github.com:xxx/yyy.git
- 修改成其他仓库地址
这种场景还是挺常见的,比如:git clone 了一份开源项目,后面发现有问题,自己修复了,然后想为开源做点贡献,就 fork 一份到自己仓库。此时本地仓库还是原开源库的地址,要修改成自己远程仓库。
命令同上:
git remote set-url origin https://github.com/thearyong/xxx.git
3. 删除远程分支
- 如果远程仓库已经存在 dev 分支,若要删除,可用如下方式:
git push origin --delete dev
或
git push origin :dev(推送空分支到远程,等价于删除远程 dev)
- 如果远程仓库已经不存在 dev 或被他人删除了,只想删除本地对应的远程分支 origin/dev,可使用:
git remote prune origin
或
git fetch -p (同步远程分支,等价于删除)
4. 拉取大仓库
git fetch origin 分支 --depth=1
其他参考:Git 如何处理大仓库
5. git 中文问题
当提交的文件名、记录说明包含中文时,可能会遇到:
✗ git status位于分支 master
初始提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
"Git\345\270\270\347\224\250\345\221\275\344\273\244\345\255\246\344\271\240\350\256\260\345\275\225.md"
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
默认情况下, 对0x80以上的字符进行quote,以八进制的字符编码表示中文内容 。要能正常以中文显示,需要设置即可:
git config --global core.quotepath false
6. 远程仓库不显示
git remote set-branches --add origin xxx
https://www.cnblogs.com/zhangyiqiu/p/11676549.html
7. GUI 推荐
上面一直写的 git 命令行,目前市面上有那么多友好的 gui 工具,能找到自己趁手的那再好不过啦,赶紧推荐一波。
注:命令行默认有个 git gui ,mac 下貌似运行不起来。window 下有个 gitk。
SourceTree
其他
- android studio--->Verstion Control
- atom ---> git插件
- Visual Studio Code---> Source Control