git基本使用

安装及配置git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sudo apt-get install git
# 配置git的用户信息
git config --global user.name="femn2014"
# git config --global user.name "femn2014" # 旧版本
git config --global user.emial="1643076443@qq.com"
# --system(/etc/gitconfig 针对所有用户) --global(~/.gitconfig 针对当前用户)
# --local(.git/config 针对当前项目 默认行为)
# 删除配置
git config --unset --global user.name="femn2014"
# 生成ssh密钥
ssh-keygen -t rsa -C "1643076443@qq.com"
# 将~/.ssh/id_rsa.pub内容上传到github服务器上,并检测是否可连接
bash ssh-add
ssh -T git@github.com
# git clone
git clone <remote_repo>
# 指定分支
git clone -b develop <remote_repo>

git 基本概念以及基本用法

git基本概念

git 目录结构

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
# 创建一个目录
mkdir demoGit && cd demoGit
git init # 初始化一个git仓库
tree -a # 查看目录结构
. # 项目文件,也就是所谓的工作区(Working Directory)
└── .git # 本地git仓库实体
├── branches
├── config # git项目级别的配置文件 git config --local 修改的就是这个文件
├── description # 项目描述信息
├── HEAD # 标记当前工作区所有的分支,是一个写有分支指针的文件
├── hooks # git默认的挂钩脚本
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── index # 索引文件,也就是所谓的暂存区,git add 命令会修改这个文件
├── info
│   └── exclude # 配置本地范围内忽略文件,不上传
├── logs # refs的历史记录,如HEAD,master分支和远程origin/master分支
│   │   ├── HEAD
│   │   └── refs
│   │   └── heads
│   │   └── master
├── objects # 是本地git仓库实际存放对象和文件快照的地方,也称作为仓库(Repository)
│   ├── info
│   └── pack
└── refs # 存放分支,标签文件和远程仓库
git branch/tag/push [branch_name]命令操作的就是这个目录下的文件
├── heads
└── tags

git 基本命令

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
# 创建两个文件
$ touch README.md hello
# 查看项目的当前状态 -s是简短的结果输出
$ git status -s
?? README.md
?? hello
# ??表示没有被索引状态
$ git add .
$ git status -s
A README.md
A hello
# A 表示已经创建索引
$ echo -e "master分支 生产版本号:1.0.0\n">>README.md
$ git status -s
AM README.md
A hello
# AM表示被索引,但在工作区已经被修改还没有add M[空格]表示缓存区被修改还没有commit
$ git rm -f hello
# 删除工作区以及暂存区的文件,如果有--cached参数则只删除暂存区
$ git mv REANDE README.md # 重命名文件
$ git commit -m 'xx' # 将暂存区的内容写入仓库
# commit 所有修改的內容送到目前的分支上
$ git commit --amend -m "master分支 生产版本号:1.0.0" # 产生一个新的提交替换之前的一次提交

diff工具,合并冲突工具:meld

1
2
3
4
5
6
7
sudo apt-get install meld
# 当安装好git,再安meld或kdiff3时,git会自动配置好
git difftool origin/master
# git difftool -t vimdiff # 使用vimdiff diff工具
# 当有冲突时
git mergetool

pull拉取 push提交 checkout分支

1
2
3
4
5
6
7
8
9
10
11
12
# git pull url/远程仓库名 远程分支名[默认同本地HEAD分支名]:[本地分支:默认是HEAD所在的分支]
# git pull = git fetch + git merge
# 在本地的master分支下拉取origin/next分支,并在master分支下进行合并
git pull origin next:master
# git push url/远程仓库名 本地分支名:[远程分支名,默认同本地分支名一样]
git push -u origin master
# 相当于是 git push -u origin master:master
git checkout -b develop [master]# 默认是在HEAD所有分支的前提下,
# 并创建一个名为develop的分支,并切换到此分支

主分支提交,并为开发者提供一个develop分支

1
2
3
4
5
6
7
8
9
git remote add origin git@gitlab.com:leipengkai/demoGit.git
git push -u origin master
git checkout -b develop # 创建一个新分支并切换到此分支,结合下面的那个命令
# git branch develop && git checkout develop
git branch # 查看分支 -d [branch_name]参数删除合并之后的无用分支 -D 强制删除分支
# develop分支也会有master的所有信息
git push -u origin develop

多个开发者,自己在开发功能的分支上开发

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
git clone git@gitlab.com:leipengkai/demoGit.git
git checkout -b develop origin/develop # 在远程origin的develop分支的基本下,创建一个分支
git checkout -b feature-femn develop # 用于开发的功能分支
echo -e "feature-femn分支 开发了一个好玩的功能\n">>README.md
git add .
git commit -m "feature-femn分支 开发了一个好玩的功能"
# 合并其它同事的功能
git checkout develop
git pull origin develop:develop # 确保本地的develop分支为最新的,develop:develop最好是这种形式
git merge feature-femn
# 将自己的功能上传
git push -u origin develop:develop # 没有冲突时直接使用
######################################################
git checkout feature-femn
echo -e "feature-femn分支 共同开发了第二个好玩的功能\n">>README.md
git add .
git commit -m "feature-femn分支 共同开发了第二个好玩的功能"
git checkout develop
# 在网页端模拟同事完成第二个功能的部分
# (fufu在网页端完成第二个功能的主要的部分)
git pull origin develop:develop
git merge feature-femn
git mergetool # 解决冲突
git add .
git commit -m "共同完成第二个功能"
git push -u origin develop:develop
# git branch -d feature-femn # 可删除本地分支

发布分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 当所有同事都开发,测试完成之后,进行发布
git checkout -b release-1.0.0 develop
# 合并master分支
git checkout master
git merge release-1.0.0
git push -u origin master
# 合并修改到 developer 分支
git checkout develop
git merge release-1.0.0
git push -u origin develop
# 可删除发布分支
git branch -d release-1.0.0
# 为master分支 发行版本的tag
git checkout master
git tag -a 1.0.0 -m "Initial public release" master
git push --tags
git log --oneline --graph --decorate --all -n 20

修复(master或develop分支的)bug

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
git checkout -b bugfix-#001(bug 分支名称) master(或develop)
# 去修bug,并commit
vim .gitignore
*.pyc 加上这句
git add .
git commit -m "忽略.pyc文件"
git checkout master
git merge bugfix-#001
git push
git branch -d bugfix-#001
# 在develop中开发
git checkout develop
vim .gitignore
.idea
git add .
git commit -m "忽略.idea目录"
git push origin develop:develop
# 合并master分支
git checkout -b merge2 master
git checkout develop
git merge merge2
git mergetool
git commit -m "忽略.pyc文件和.idea目录"
# 如果不push的话,再使用 commit --amend是不会有多分支的
git push origin develop:develop
# 突然又想改一点小地方,不想单独提交一次
vim .gitignore
Docker/nginx/log
git add .
git commit --amend -m "忽略.pyc文件,.idea目录 Docker/nginx/log目录"
git log --oneline --graph --decorate --all -n 20
* 275fcc8 (HEAD -> develop) 忽略.pyc文件,.idea目录 Docker/nginx/log目录
|\
| | * 91d6986 (origin/develop) 忽略.pyc文件和.idea目录
| | |\
| |/ /
|/| /
| |/
| * 6a78c8c (origin/master, merge2, master) 忽略.pyc文件
* | 586c422 忽略.idea目录
|/
* 8fac61d (tag: 1.0.0) 共同完成第二个功能
|\
| * 09759fd (feature-femn) feature-femn分支 共同开发了第二个好玩的功能
* | 7e18791 fufu在网页端完成第二个功能的主要的部分
|/
* 90e6505 feature-femn分支 开发了一个好玩的功能
* 10a5209 master分支 生产版本号:1.0
git pull
# git pull origin origin/develop:develop
git mergetool
git commit -m "忽略规则"
git push origin develop:develop

创建标签

1
2
3
4
5
6
7
8
9
10
11
git tag -a v1.0 -m "tag 1"
git log --oneline --decorate --graph
* 9229ec9 (HEAD -> new_branch, tag: v1.0) new_branch 1
* 6c0975b master 1
git tag
git show v1.0
# 默认情况下,git push 并不会把标签传送到远端服务器上
# git push origin v1.0 # 分享标签到远程仓库
# git push origin --tags # 推送所有本地新增的标签
# git tag -d tagname # 删除标签

图解GIT

.gitignore规则

  1. 不会对空目录进行索引和跟踪
  2. dir(dir/*):表示.gitignore所在目录下的dir目录的所有内容,不会被跟踪,同时也不会生成此目录.

    不可以写成./dir

    .gitignore文件生效问题

    1
    2
    3
    # 已经track且有改动的文件添加ignore规则
    git rm -r --cached *.pyc # 要忽略的文件
    # 最好是创建项目的时候,写要ignore规则

删除上次commit(HEAD)

1
2
3
4
5
6
7
git reset --soft HEAD~1(回滚到HEAD~1版本,就是删除HEAD)
# 如果没有 --soft,则在删除上次(HEAD)的同时,还会将Stage区的内容替换成HEAD~1
# 将本地更新强行推送至服务器(想要删除某个远程commit提出的)
# 强制push使得远程commit与本地的commit一模一样
git push --force origin master
# 注意:此参数不能在团队中使用,不然别人的提出就会被删除了
Share Comments