Git命令行操作

1.1本地库初始化

进入文件夹

1
2
git init
注意:生成的 .git 目录中存放的是本地库相关文件,不要删除

1.2设置签名

  • 项目(仓库)级别仅在当前本地库有效

    1
    2
    git config user.name tom  #设置用户名tom
    git config user.email liu@qq.com #设置用户邮箱
  • 系统用户级别仅在当前登录的操作系统用户有效

    1
    2
    git config --global user.name tom
    git config --global user.email liu@qq.com

仅仅加了一个 --global

优先级别:项目级别 > 系统级别

信息保存位置:~/.gitconfig 文件

1.3基本操作

1.3.1 状态查看

1
git status   #查看工作区、暂存区状态

1.3.2 添加

1
2
3
git add fileName  #指定文件
git add . #所有
说明:将工作区的文件添加到暂存区

1.3.3 提交

1
2
git commit -m 'commit message' fileName
说明:将暂存区内容提交到本地库

1.3.4 查看历史记录

1
2
3
4
5
6
git log 
git reflog #常用 显示当前分支的最近几次提交
git log --graph #图形显示,更直观
git log --pretty=oneline #漂亮一行显示
git log --oneline #简洁显示
说明:HEAD@{移动到当前版本需要多少步}

1.3.5 前进后退

1.3.6 reset的三个参数比较

1
2
3
4
5
6
7
8
9
soft: 
- 仅本地库移动HEAD 指针
mixed:
- 在本地库移动HEAD指针
- 重置暂存区
hard:
- 在本地库移动HEAD指针
- 重置暂存区
- 重置工作区

git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本.

为了更好地理解git reset,我们来回顾一下,Git的版本管理及HEAD的理解

Git的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是master,HEAD指针一般指向当前分支,如下:

假设执行git reset,回退到版本二之后,版本三不见了哦,如下:

1.3.7 删除文件并找回

  • 相当于建立一个快照,虽然删除了,但只要添加到暂存区,就能找回
1
git reset --hard 指针位置

1.3.8 文件差异比较

1
2
3
git diff 文件名
git diff 哈希值 文件名 #和历史中的一个版本比较
git diff #不带文件名,则比较多个文件

1.3.9 git stash

stash命令可用于临时保存和恢复修改

1
2
3
4
5
6
git stash  把当前的工作隐藏起来 等以后恢复现场后继续工作 
git stash list 显示保存的工作进度列表
git stash pop stash@{num} 恢复工作进度到工作区
git stash show :显示做了哪些改动
git stash drop stash@{num} :删除一条保存的工作进度
git stash clear 删除所有缓存的stash。 复制代码

2.2 分支管理

hot_fix master feature_x feature_y

2.2.1 什么是分支管理

  • 在版本控制中,使用推进多个任务

2.2.2 分支的好处

  • 同时并行推进多个功能开发,提高开发效率
  • 某一分支开发失败,不会对其它分支有任何影响

2.2.3 分支操作

  • 创建分支
1
git branch 分支名
  • 查看分支
1
2
git branch
git branch -v
  • 切换分支
1
2
git checkout 分支名
git checkout -b 分支名 #创建分支并直接切换到该分支
  • 合并分支相当于把修改了的文件拉过来
1
2
3
git merge xxx
注意:合并分支的时候要明确谁谁合并
我在a分支里面修改了。要合并到master,就先切换到master,然后合并b
  • 删除分支
1
git branch -d 分支名

2.2.4 解决冲突

  • 冲突的表现
  • 冲突的解决
    • 第一步:编辑,删除特殊标记<<< ===
    • 第二步:修改到满意位置,保存退出
    • 第三步:添加到缓存区 git add 文件名
    • 第四步:提交到本地库git commit -m '日志信息' 注意:后面一定不能带文件名

Git 结合Github


创建一个新的存储库

git init
git add .
git commit -m “first commit”
git branch -M master
git remote add origin https://github.com/wuz/XiaMi-Shop.git
git push -u origin master

已经有仓库

git remote add origin https://github.com/wuz/XiaMi-Shop.git
git branch -M master
git push -u origin master


别分手 别名 分支名

1.1 创建远程库地址别名

1
2
3
git remote -v  #查看远程地址别名
git remote add 别名 远程地址
例子:git remote add origin https://xx

1.2 推送

开发修改完把本地库的文件推送到远程仓库 前提是提交到了本地库才可以推送

1
2
3
git push 别名 分支名
git push -u 别名 分支名 #-u指定默认主机
例子:git push origin master

1.3 克隆

完整的把远程库克隆到本地 克隆下来后不要在主分支里面做开发 clone进行一次,从无到有的过程,更新用pull

1
2
git clone  远程地址
例子:git clone https://xx

1.4 拉取

本地存在clone下来的文件 就用pull更新

注意: 如果你提交成功下班后:同事也向该远程仓库提交了新的内容。第二天上班时,你需要拉去线上的仓库的最新版本。

1
2
3
4
pull = fetch + merge
git fetch 别名 分支名
git merge 别名 分支名
git pull 别名 分支名

因此在每天工作的第一件事就是git pull 拉取线上的最新版本,下班要做的就是 git push,将本地代码提交到线上仓库。

1.5 解决冲突

注意:解决冲突后的提交是不能带文件名的

如果不是基于远程库最新版做的修改不能推送,必须先pull下来安装冲突办法解决

1.6 rebase

rebase又称为衍合,是合并的另外一种选择。

假设有两个分支master和test

1
D---E test       /  A---B---C---F--- master 复制代码

执行 git merge test得到的结果

1
D--------E       /          \  A---B---C---F----G---   test, master 复制代码

执行git rebase test,得到的结果

1
A---B---D---E---C‘---F‘---   test, master 复制代码

rebase好处是: 获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。所以很多时候,看到有些伙伴都是这个命令拉代码:git pull –rebase

1.7 beyond compare

用软件解决冲突

1
2
3
4
5
6
7
8
9
1.安装 :
beyond compare
2.配置:
git config --local merge.tool bc3 #合并名称
git config --local mergetool.path '/usr/local/bin/bcomp' #软件路径
git config --local mergetool.keepBackup false #False不用保存备份
3.应用:
git mergetool
说明:--local指只在当前操作系统有效

1.8 跨团队合作

代码review之后合并

  • 适用于个人

    邀请成员:Settings –> Collaborators –>填写用户名 –>打开链接接受邀请

  • 企业 创建一个组织 方便管理

  • review

    组织做review 通过Pull request

  • 给开源社区共享代码

    点击别人仓库的fork 到自己的仓库 – > 然后clone下来 修改后推送到远程库 –> 点击Pull Request请求 –> Create pull request发消息

1.9 Tag标签

为了清晰的版本管理,公司一般不会直接使用commit提交

1
2
3
4
5
6
7
git tag -a v1.0 -m '版本介绍'   #创建本地tag信息
git tag -d v1.0 #删除tag
git push origin --tags #将本地tag信息推送到远程库
git pull origin --tags #拉取到本地

git checkout v.10 #切换tag
git clone -b v0.1 地址 #指定tag下载代码

1.10 SSH 免密登录

  • 输入:ssh-keygen -t rsa -C GitHub邮箱地址
  • 进入.ssh目录,复制id_rsa.pub文件内容
  • 登录GitHub。Settings –> SSH and GPG keys –> New SSH Key
  • 回到git通过ssh地址创建。git remote add 别名 SSH地址

Git工作流

1.1 概念

1
在项目开发过程中使用Git的方式

1.2 分类

1.2.1 集中式工作流
1
像SVN一样,集中式工作流有一个中央仓库,所有的修改都提交到了Master分支上
1.2.2 GitFlow工作流 *

主干分支master 开发分支develop 修复分支hotfix 预发布分支release 功能分支feature

1
GitFlow 有独立的分支,让发布迭代过程更流畅。
1.2.3 Forking 工作流
1
2
在 GitFlow 基础上, 充分利用了 Git 的 Fork 和 pull request 的功能以达到代码审核的目的。 
安全可靠地管理大团队的开发者

Git基本理论(重要)

1.1 三个区域

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

  • Workspace:工作区,就是你平时存放项目代码的地方
  • Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

本地的三个区域确切的说应该是git仓库中HEAD指向的版本:

  • Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
  • Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
  • Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
  • Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

1.2 工作流程

git的工作流程一般是这样的:

1、在工作目录中添加、修改文件;

2、将需要进行版本管理的文件放入暂存区域;

3、将暂存区域的文件提交到git仓库。

因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

1.3 文件的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

  • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
  • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
  • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

总结(详细)

1.1 新建代码库

1
2
3
4
5
6
7
8
# 在当前目录新建一个Git代码库
$ git init

# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

# 下载一个项目和它的整个代码历史
$ git clone [url]

1.2 配置

Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)

1
2
3
4
5
6
7
8
9
# 显示当前的Git配置
$ git config --list

# 编辑Git配置文件
$ git config -e [--global]

# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

1.3 增加/删除文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

1.4 代码提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...

1.5分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 新建一个分支,指向指定commit
$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

1.6 标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 列出所有tag
$ git tag

# 新建一个tag在当前commit
$ git tag [tag]

# 新建一个tag在指定commit
$ git tag [tag] [commit]

# 删除本地tag
$ git tag -d [tag]

# 删除远程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

1.7 远程同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 下载远程仓库的所有变动
$ git fetch [remote]

# 显示所有远程仓库
$ git remote -v

# 显示某个远程仓库的信息
$ git remote show [remote]

# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]

# 上传本地指定分支到远程仓库
$ git push [remote] [branch]

# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force

# 推送所有分支到远程仓库
$ git push [remote] --all

1.8 撤销

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 恢复暂存区的指定文件到工作区
$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop


参考链接:

https://mp.weixin.qq.com/s/Bf7uVhGiu47uOELjmC5uXQ

http://www.cpengx.cn/p/554.html

http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html



愿你的坚持总有收获