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 分支管理:

  1. 查看本地分支
    ```shell

    git branch 等价于git branch --list

    ➜ gitTest git:(master) ✗ git branch
  2. master
    dev```

  3. 查看远程分支

    git branch -r:显示对应的远程分支  
    git branch -a:显示本地和对应的远程分支
    
  4. 新建分支

    git branch fixbug:基于当前分支,新建分支 fixbug  
    git checkout -b fixbug:会自动切换到 fixbug 分支
    
  5. 修改分支名

    git branch -m dev release
    
  6. 删除分支

  7. 删除本地分支

    git branch -d/-D dev  
    git branch |grep 'branchName' |xargs git branch -D #通过 grep 匹配分支,批量删除
    
  8. 删除远程分支

    进阶命令#3. 删除远程分支

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

  1. 全局的用户配置:

    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
  1. 针对指定项目设置用户名和邮箱:

    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

对远程仓库的管理操作指令,常用的有:

  1. 查看远程仓库地址

  2. 修改远程仓库地址

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 区别

  1. 文件存储上,比 svn 多一个暂存区,方便随时取消操作,不会产生记录。
存储 git svn
本地暂存区 add
本地仓库 commit add
远程仓库 push commit
  1. 分布式和集中式

目录结构

前面讲到,通过 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

参考

results matching ""

    No results matching ""