Git

#0. 简单Git操作,SSH设置回顾

一些简单的git操作

常用的git操作

#1. 工作区和暂存区和分支

重新回顾一下Git中最重要的暂存区概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
git add filename -> 将文件提交的所有修改暂存到暂存区
git commit -m "some tips" -> 将文件修改提交到分支, 默认为master分支,即主分区
git diff HEAD -- filename ->可以查看工作区和版本库里面最新版本的区别, 其中HEAD表示版本库中的当前版本
git checkout -- filename ->丢弃工作区的修改
"""
把filename文件在工作区的修改全部撤销,这里有两种情况:
一种是filename自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态
一种是filename已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
- 摘自廖雪峰的git教程
#git checkout其实是用版本库里的版本替换工作区的版本
"""
git reset HEAD file ->可以把暂存区的修改撤销掉(unstage),重新放回工作区
  • 删除操作
1
2
#删除已经commit的文件, 然后再次commit
git add filename

#2. 分支管理

进入正题 : 分支管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git branch branchname #创建分支branchname
git checkout branchname #切换分支到branchname
git checkout -b branchname #这条命令执行上面两个命令的功能, 也就是创建并切换到分支branchname
git branch #列出所有的分支,当前分支前面会标一个*号
➜ Team git:(team) ✗ git branch
master
* team
#在分支上的修改和默认master的修改是独立的, 也就是说在分支上进行修改后, 切换会master里, master的整个工作区与在分支修改之前是保持不变的
git merge branchname #将分支的修改合并到master
git branch -d branchname #合并结束后用于删除分支, 注意-d

当master和分支上分别进行了版本commit后, 就会造成冲突

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#我对master和分支上的README.md进行了修改和一次commit后, 造成冲突
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result
➜ Team git:(master) ✗ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: README.md #注意显示both modified
#此时提交的文件也发生了变化
此时进入文件后解决冲突, 然后重新提交
git log --graph --pretty=oneline --abbrev-commit #commit使用整个命令查看分支合并情况
  1. 出现冲突时,在master修改冲突并commit之前无法切换到branchname 分支。
  2. master修改冲突并提交之后切换到branchname,发现branchname内容保持原来不变。

#3. 多人协作

1
2
git push origin master #用于推送master分支,
git push origin branchname #用于推送分支
1
2
3
4
5
6
7
8
9
以下语句摘自廖雪峰, 具体操作请看下面代码
多人协作的工作模式通常是这样:
1. 首先,可以试图用git push origin branch-name推送自己的修改;
2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3. 如果合并有冲突,则解决冲突,并在本地提交;
4. 没有冲突或者解决掉冲突后,再用git push origin branchname推送就能成功!
> 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令`git branch --set-upstream branchname origin/branch-name`。
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
远程协作的整体步骤总结
1. git clone XXXX #克隆仓库
2. git branch -a #查看远程分支
#假设有以下这些分支
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/team
#若只有master分支, 可以在本地创建新的分支, 然后切换到分支工作后, 直接进行commit, 然后git push origin remotebranchname, 这句话会再远程创建一个分支名为remotebranchname
3. git checkout -b team origin/team #创建本地分支和要跟踪的远程推送分支
4. git commit -m "add something" #首先对分支内容进行一些修改在team分支修改并提交
5. git push origin team #推送到远程分支team
#以下为推送成功信息
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 275 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:Andrew-liu/CradleStudio.git
a1de49f..3b6e09b team -> team
#以下是协作冲突的处理, 此处code是远程仓库的代号, 可以通过git remote -v查看, code相当于默认的origin,即要推送或拉取的仓库
6. git push code team
#此时另一个协作着对同一个远程分支进行推送会发生错误
To git@github.com:Andrew-liu/CradleStudio.git
! [rejected] team -> team (fetch first)
error: failed to push some refs to 'git@github.com:Andrew-liu/CradleStudio.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
7. git pull code team #首先应尝试pull解决冲突
From github.com:Andrew-liu/CradleStudio
* branch team -> FETCH_HEAD
a1de49f..3b6e09b team -> code/team
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the resul
8. 手动合并冲突, 查看冲突的文件, 会有明确的冲突信息标注
9. 重新推送成功
3b6e09b..7bc0cfa team -> team #修改推送成功, 完成一次远程协作

#4. 参考连接
廖雪峰的Git教程