mirror of
https://github.com/Estom/notes.git
synced 2026-02-09 13:27:09 +08:00
Merge branch 'master' of gitee.com:Eyestorm/notes
This commit is contained in:
80
Git/1 基本操作.md
Normal file
80
Git/1 基本操作.md
Normal file
@@ -0,0 +1,80 @@
|
||||
Git的本地操作
|
||||
|
||||
> 参考文献
|
||||
> * [git使用教程](https://github.com/geeeeeeeeek/git-recipes/wiki)
|
||||
|
||||
## 1 git安装
|
||||
|
||||
- Linux上通过命令行能够很轻松的部署好git
|
||||
- Windows上需要安装GitBash,模拟linux命令行
|
||||
- 安装完成后需要配置全局信息的命令
|
||||
|
||||
```
|
||||
git config --global user.name "Your Name"
|
||||
git config --global user.email "email@example.com"
|
||||
```
|
||||
|
||||
## 2 创建版本库
|
||||
|
||||
```
|
||||
git init
|
||||
```
|
||||
生成.git文件,将这个目录初始化为一个版本的仓库。
|
||||
|
||||
```
|
||||
git add readme.txt
|
||||
```
|
||||
|
||||
将文件添加到缓冲区,可以连续多次向缓冲区中添加东西
|
||||
|
||||
```
|
||||
git commit -m "wrote a message"
|
||||
```
|
||||
将缓冲区的文件提交到历史记录当中当中,可以一次提交对缓冲区的多次修改。
|
||||
|
||||
## 3 时光穿梭机
|
||||
|
||||
```
|
||||
git status
|
||||
```
|
||||
|
||||
用来查看当前仓库的状态。主要有changes not staged for
|
||||
commit状态(工作区有变化没有提交),chages to be
|
||||
committed状态(缓存区有变化等待提价)
|
||||
|
||||
```
|
||||
git diff readme.txt
|
||||
```
|
||||
|
||||
用来对比工作区和历史记录内容的差别。
|
||||
|
||||
|
||||
## 5 工作区和暂存区
|
||||
|
||||
### **概念理解**
|
||||
|
||||
- 工作区Wording Directory:在电脑中能够看到的目录,是工作区
|
||||
|
||||
- 版本库Repository:工作区有一个隐藏的目录.git是版本库
|
||||
|
||||
- 版本库中有Stage暂存区和master等分支以及一个纸箱master的指针HEAD
|
||||
|
||||
- git跟踪管理的是对文件的修改而并非文件本身
|
||||
|
||||
### **撤销修改**
|
||||
```
|
||||
git checkout --readme.txt
|
||||
```
|
||||
把readme.txt在工作区的修改全部撤销掉。如果缓存区有readme.txt的中间状态,则从缓存区恢复,如果缓存区没有readme.txt的中间状态,则从版本库中恢复。
|
||||
|
||||
```
|
||||
git reset HEAD readme.txt
|
||||
```
|
||||
把readmen.txt在缓存区的修改全部撤销掉。但是依然会保留工作区的修改。
|
||||
|
||||
### **删除文件**
|
||||
```
|
||||
git rm test.txt
|
||||
```
|
||||
|
||||
把某个文件从缓存区删掉,然后commit之后会从版本库删掉。如果删错了可以通过checkout从缓存区恢复这个文件。
|
||||
61
Git/10 标签管理.md
Normal file
61
Git/10 标签管理.md
Normal file
@@ -0,0 +1,61 @@
|
||||
|
||||
## 10 标签管理
|
||||
|
||||
### **创建标签**
|
||||
|
||||
```
|
||||
git tag v1.0
|
||||
```
|
||||
|
||||
对当前版本打标签,为v1.0
|
||||
|
||||
```
|
||||
git tag
|
||||
```
|
||||
查看所有已经创建的标签
|
||||
|
||||
```
|
||||
git tag v0.9 6.225
|
||||
```
|
||||
|
||||
对指定id的版本打标签
|
||||
```
|
||||
git show v0.9
|
||||
```
|
||||
|
||||
查看标签信息
|
||||
|
||||
```
|
||||
git tag -a v0.1 -m "version 0.1 released" 3628164
|
||||
```
|
||||
|
||||
创建带有标签说明的标签
|
||||
|
||||
### **操作标签**
|
||||
|
||||
```
|
||||
git tag -d v0.1
|
||||
```
|
||||
|
||||
删除制定版本的标签
|
||||
|
||||
```
|
||||
git push origin v1.0
|
||||
```
|
||||
|
||||
推送某个标签到远程
|
||||
|
||||
```
|
||||
git push origin --tags
|
||||
```
|
||||
|
||||
一次性推送所有标签。
|
||||
|
||||
```
|
||||
git tag -d v0.9
|
||||
|
||||
git push origin :refs/tags/v0.9
|
||||
```
|
||||
|
||||
从远程删除标签,先在本地删除标签,然后将操作推送到远程。
|
||||
|
||||
220
Git/4 版本回退.md
Normal file
220
Git/4 版本回退.md
Normal file
@@ -0,0 +1,220 @@
|
||||
# 4 版本回退
|
||||
|
||||
## 1 git的工作流
|
||||
|
||||
### 提交工作流
|
||||
* 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。
|
||||
* 暂存区:已经 git add xxx 进去,且未 git commit xxx 的。
|
||||
* 本地分支:已经git commit -m xxx 提交到本地分支的。
|
||||
|
||||

|
||||
|
||||
### 回滚工作流
|
||||
|
||||
在上传代码到远程仓库的时候,不免会出现问题,任何过程都有可能要回滚代码:
|
||||
|
||||
git reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。
|
||||
```
|
||||
git reset --hard HEAD^
|
||||
```
|
||||
即往前回退一个版本,回退完了后工作区就是上一个版本的代码了,并且是clean的。
|
||||
```
|
||||
git reset --soft HEAD^
|
||||
```
|
||||
往前回退一个版本,并且将这次错误的提交的代码改动,放在暂存区里。
|
||||
```
|
||||
git reset --mixed HEAD^(和不带参数是一样的)
|
||||
```
|
||||
往前回退一个版本,并且将这次错误的提交的代码改动,放在工作区里。
|
||||
|
||||
|
||||
## 2 Git撤销&回滚操作(git reset 和 get revert)
|
||||
|
||||
|
||||
### 在工作区的代码
|
||||
```
|
||||
git checkout -- a.txt # 丢弃某个文件,或者
|
||||
git checkout -- . # 丢弃全部
|
||||
```
|
||||
|
||||
* 注意:git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。
|
||||
|
||||
### 代码git add到缓存区,并未commit提交
|
||||
```
|
||||
git reset HEAD . 或者
|
||||
git reset HEAD a.txt
|
||||
```
|
||||
|
||||
* 这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
|
||||
|
||||
### git commit到本地分支、但没有git push到远程
|
||||
|
||||
```
|
||||
git log # 得到你需要回退一次提交的commit id
|
||||
git reset --hard # 回到其中你想要的某个版
|
||||
```
|
||||
或者
|
||||
```
|
||||
git reset --hard HEAD^ # 回到最新的一次提交
|
||||
```
|
||||
或者
|
||||
```
|
||||
git reset HEAD^ # 此时代码保留,回到 git add 之前
|
||||
```
|
||||
|
||||
### it push把修改提交到远程仓库
|
||||
1. 通过git reset是直接删除指定的commit
|
||||
```
|
||||
git log # 得到你需要回退一次提交的commit id
|
||||
git reset --hard
|
||||
git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除
|
||||
```
|
||||
2. 通过git revert是用一次新的commit来回滚之前的commit
|
||||
```
|
||||
git log # 得到你需要回退一次提交的commit id
|
||||
git revert # 撤销指定的版本,撤销也会作为一次提交进行保存
|
||||
```
|
||||
3. git revert 和 git reset的区别
|
||||
|
||||
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
|
||||
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除
|
||||
|
||||
## 3 场景
|
||||
|
||||
### 场景一:
|
||||
|
||||
糟了,我刚把不想要的代码,commit到本地仓库中了,但是还没有做push操作!
|
||||
|
||||
### 场景二:
|
||||
|
||||
彻底完了,刚线上更新的代码出现问题了,需要还原这次提交的代码!
|
||||
|
||||
### 场景三:
|
||||
|
||||
刚才我发现之前的某次提交太愚蠢了,现在想要干掉它!
|
||||
|
||||
## 4 操作
|
||||
### 针对场景一
|
||||
|
||||
在未进行git push前的所有操作,都是在“本地仓库”中执行的。我们暂且将“本地仓库”的代码还原操作叫做“撤销”!
|
||||
|
||||
* 情况一:文件被修改了,但未执行git add操作(working tree内撤销)
|
||||
|
||||
```
|
||||
git checkout fileName
|
||||
|
||||
git checkout .
|
||||
```
|
||||
* 情况二:同时对多个文件执行了git add操作,但本次只想提交其中一部分文件
|
||||
|
||||
```
|
||||
$ git add *
|
||||
|
||||
$ git status
|
||||
|
||||
# 取消暂存
|
||||
|
||||
$ git reset HEAD
|
||||
```
|
||||
* 情况三:文件执行了git add操作,但想撤销对其的修改(index内回滚)
|
||||
|
||||
````
|
||||
# 取消暂存
|
||||
|
||||
git reset HEAD fileName
|
||||
|
||||
# 撤销修改
|
||||
|
||||
git checkout fileName
|
||||
````
|
||||
* 情况四:修改的文件已被git commit,但想再次修改不再产生新的Commit
|
||||
|
||||
```
|
||||
# 修改最后一次提交
|
||||
|
||||
$ git add sample.txt
|
||||
|
||||
$ git commit --amend -m"说明"
|
||||
```
|
||||
* 情况五:已在本地进行了多次git commit操作,现在想撤销到其中某次Commit
|
||||
```
|
||||
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
|
||||
```
|
||||
|
||||
|
||||
### 针对场景二
|
||||
|
||||
已进行git push,即已推送到“远程仓库”中。我们将已被提交到“远程仓库”的代码还原操作叫做“回滚”!注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!
|
||||
|
||||
如果你每次更新线上,都会打tag,那恭喜你,你可以很快的处理上述场景二的情况
|
||||
```
|
||||
git checkout
|
||||
```
|
||||
|
||||
|
||||
如果你回到当前HEAD指向
|
||||
```
|
||||
git checkout
|
||||
```
|
||||
* 情况一:撤销指定文件到指定版本
|
||||
|
||||
```
|
||||
# 查看指定文件的历史版本
|
||||
|
||||
git log
|
||||
|
||||
# 回滚到指定commitID
|
||||
|
||||
git checkout
|
||||
```
|
||||
* 情况二:删除最后一次远程提交
|
||||
|
||||
* 方式一:使用revert
|
||||
* 方式二:使用reset
|
||||
|
||||
|
||||
```
|
||||
git revert HEAD
|
||||
|
||||
git push origin master
|
||||
```
|
||||
|
||||
```
|
||||
git reset --hard HEAD^
|
||||
|
||||
git push origin master -f
|
||||
```
|
||||
二者区别:
|
||||
|
||||
revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
|
||||
reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。
|
||||
|
||||
* 情况三:回滚某次提交
|
||||
|
||||
```
|
||||
# 找到要回滚的commitID
|
||||
|
||||
git log
|
||||
|
||||
git revert commitID
|
||||
```
|
||||
删除某次提交
|
||||
```
|
||||
git log --oneline -n5
|
||||
```
|
||||
|
||||
Git撤销&回滚操作(git reset 和 get revert)2
|
||||
```
|
||||
git rebase -i "commit id"^
|
||||
```
|
||||
注意:需要注意最后的^号,意思是commit id的前一次提交
|
||||
```
|
||||
git rebase -i "5b3ba7a"^
|
||||
```
|
||||
Git撤销&回滚操作(git reset 和 get revert)3
|
||||
|
||||
在编辑框中删除相关commit,如pick 5b3ba7a test2,然后保存退出(如果遇到冲突需要先解决冲突)!
|
||||
```
|
||||
git push origin master -f
|
||||
```
|
||||
通过上述操作,如果你想对历史多个commit进行处理或者,可以选择git rebase -i,只需删除对应的记录就好。rebase还可对 commit 消息进行编辑,以及合并多个commit
|
||||
118
Git/7 远程操作.md
Normal file
118
Git/7 远程操作.md
Normal file
@@ -0,0 +1,118 @@
|
||||
|
||||
## 7 Git的远程操作
|
||||
|
||||
远程操作主要是指,在不同的仓库之间进行提交和代码更改。是一个明显的对等的分布式系统。其中本地个仓库与远程仓库,不同的远程仓库之间都可以建立这种关系。这种关系之间的操作主要有pull和push。
|
||||
|
||||
### **远程仓库**
|
||||
|
||||
创建SSH key远程仓库和本地仓库一般是通过ssh通信的,需要ssh通信的加密钥匙。
|
||||
|
||||
id_rsa是私钥,id_rsa.pub是公钥,可以告诉别人。
|
||||
```
|
||||
ssh-keygen -t rsa -C 'yinkanglong@163.com'
|
||||
```
|
||||
|
||||
登录github,添加公钥内容。建立本地与远程仓库的通信协议
|
||||
|
||||
### **添加远程仓库**
|
||||
|
||||
github的界面操作可以很轻松的创建一个远程仓库。但如果想要直接上传自己本地的完整git库,必须创建一个没有lisence和readme的空库。
|
||||
|
||||
```
|
||||
git remote add origin git@github.com:michaelliao/learngit.git
|
||||
```
|
||||
将本地仓库和远程仓库进行关联。一般都叫远程关联仓库为origin,本地的主干分支一般名为master
|
||||
|
||||
```
|
||||
git push -u origin master
|
||||
```
|
||||
|
||||
将本地的主干分支master推送到远程的origin分支上。-u参数实现了两个分支的关联,将远程的git仓库的master和本地的master进行了分支管理,当再次执行时,只需要使用git
|
||||
push origin master命令。
|
||||
|
||||
### **从远程仓库克隆**
|
||||
|
||||
```
|
||||
git clone git@github.com:michaelliao/gitskills.git
|
||||
```
|
||||
|
||||
|
||||
### **git remote**
|
||||
|
||||
```
|
||||
git remote
|
||||
```
|
||||
|
||||
列出你和远程仓库之间的远程连接
|
||||
|
||||
```
|
||||
git remote -v
|
||||
```
|
||||
|
||||
列出每个连接的名字和url
|
||||
|
||||
```
|
||||
git remote add <name> <url>
|
||||
```
|
||||
|
||||
创建一个新的远程连接并添加名字
|
||||
```
|
||||
git remote rm <name>
|
||||
```
|
||||
|
||||
移除远程仓库的链接
|
||||
|
||||
### **git fetch**
|
||||
|
||||
```
|
||||
git fetch <remote>
|
||||
```
|
||||
|
||||
拉取仓库中的所有分支(包括相关的文件和所有的提交)
|
||||
```
|
||||
git fetch <remote> <branch>
|
||||
```
|
||||
|
||||
拉取制定仓库中的所有分支(包括相关的文件和所欲的提交)
|
||||
|
||||
> 注意,这个步骤知识拉取远程的分支,在本地并没有合并也没有生成本地分支,知识一个可读的远程分支。
|
||||
> * 使用git branch -r 命令可以查看所有只读的远程分支。
|
||||
> * 使用gitcheckout命令可以创建本地分支,并与远程分支关联。
|
||||
> * 使用git merge命令可以将远程分支与本地分支合并。
|
||||
|
||||
### **git pull**
|
||||
```
|
||||
git pull remote
|
||||
```
|
||||
|
||||
拉取当前分支对应的远程副本,并将远程副本的更改写入本地副本。相当于git fetch之后git merge。
|
||||
|
||||
```
|
||||
git pull -rebase \<remote\>
|
||||
```
|
||||
|
||||
使用git rebase命令合并远程分支与本地分支,不使用git merge
|
||||
|
||||
### **git push**
|
||||
|
||||
```
|
||||
git push <remote> \<branch\>
|
||||
```
|
||||
|
||||
将制定分支推送到远程分支。包括所有的文件和提交。
|
||||
|
||||
```
|
||||
git push <remote> --force
|
||||
```
|
||||
强制推送
|
||||
```
|
||||
git push <remote> --all
|
||||
```
|
||||
|
||||
本地所有的分支推送到远程仓库当中
|
||||
|
||||
```
|
||||
git push <remote> --tags
|
||||
```
|
||||
|
||||
将本地所有标签推送到远程仓库中
|
||||
110
Git/8 分支管理.md
Normal file
110
Git/8 分支管理.md
Normal file
@@ -0,0 +1,110 @@
|
||||
|
||||
## 8 分支管理
|
||||
|
||||
这里主要体现的git的功能的分离,这才是真正的git吧。每一个分支都是一个单独的可以分离的工作单位。每个用户可以建立不同的分支进行工作,最终提交到同一个开发分支上。一个用户可以建立不同的分支实现不同的功能,最终提交到同一个用户分支上。分支的灵活性,可以让我们很容易的实现不同分工的分割。
|
||||
|
||||
### **创建分支**
|
||||
|
||||
```
|
||||
git checkout -b dev
|
||||
```
|
||||
创建分支,并且将工作目录切换到dev的工作目录上。
|
||||
|
||||
```
|
||||
git branch dev
|
||||
```
|
||||
使用当前版本分支创建新的分支(即添加一个分支指针)。
|
||||
```
|
||||
git checkout dev
|
||||
```
|
||||
将工作区切换到某一个分支指针所指的版本上。
|
||||
```
|
||||
git branch
|
||||
```
|
||||
会列出所有的分支目录。
|
||||
|
||||
### **分支合并**
|
||||
|
||||
```
|
||||
git merge dev
|
||||
```
|
||||
|
||||
将dev分支合并到当前工作目录下的分支上(不一定是产生他的父分支)
|
||||
```
|
||||
git branch -d dev
|
||||
```
|
||||
用来删除一个已经无效的分支指正,但是在这个分支指针上左右的操作都会保留。
|
||||
|
||||
### **解决冲突**
|
||||
|
||||
- 当合并过程中出现冲突,会进入长途解决工作区,手动解决后提交,就会退出。
|
||||
|
||||
- 关于一点,提交后的分支有必要继续工作吗,都行。完全可以提交后删掉重新创建一个分支,获取主干分支上集成的最新内容,然后继续工作。也可以直接在分支上合并一次主干分支,然后得到最新的内容,继续在原来的分支上进行工作。
|
||||
|
||||
```
|
||||
git log --graph
|
||||
```
|
||||
|
||||
可以查看分支合并图。
|
||||
|
||||
### **分支合并方式**
|
||||
```
|
||||
git merge --no-ff -m "merge messge" dev --no-ff
|
||||
```
|
||||
不适用fastfoward方式进行合并,会产生一个新的版本节点。加上-m参数,是因为这种方式合并过程中会自己提交合并后的版本。
|
||||
|
||||
### **分支管理**
|
||||
|
||||
- 团队合作的分支管理组图就是你们要的方式
|
||||
|
||||

|
||||
|
||||
### **BUG分支**
|
||||
|
||||
- 因为总会在自己工作的过程中出现紧急的需要更改的bug,但是现在工作区中的内容还不能提交,所以必须生成现在工作区的一个快照,等处理完紧急的bug之后,再来回复工作区的内容。
|
||||
|
||||
```
|
||||
git stash
|
||||
```
|
||||
将当前的工作现场储存起来,等到修复完成bug之后可以再次进行更改。工作现场包括工作区和stage缓存区。然后可以清空工作区和缓存区的内容,新建bug分支进行工作。
|
||||
|
||||
```
|
||||
git stash list
|
||||
```
|
||||
用来查看保存中的工作区。
|
||||
|
||||
```
|
||||
git stash apply stash@{0}
|
||||
```
|
||||
恢复stash内容,但并不清楚stash列表中的内容。
|
||||
|
||||
```
|
||||
get stash drop
|
||||
```
|
||||
用来删除stash列表中的内容。(因为已经恢复或者没有必要恢复)
|
||||
|
||||
```
|
||||
git stash pop
|
||||
```
|
||||
可以用来弹出stash列表中的内容。
|
||||
|
||||
### **Feature分支**
|
||||
|
||||
- 当添加一个新的功能的时候,因为是一些实验性的代码,所以要创建一个单独的分支进行处理。
|
||||
|
||||
- git checkout -b feature-vulcan
|
||||
|
||||
创建一个新的功能分支
|
||||
```
|
||||
git status
|
||||
|
||||
git add vulcan.py
|
||||
|
||||
git commit -m "add feature vulcan"
|
||||
|
||||
git checkout dev
|
||||
|
||||
git merge vulcan.py
|
||||
|
||||
git branch -D feature-vulcan 不合并,强制删除
|
||||
```
|
||||
54
Git/9 多人协作.md
Normal file
54
Git/9 多人协作.md
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
## 9 多人协作
|
||||
|
||||
通过远程库的push和pull操作实现夺人合作
|
||||
|
||||
### **推送分支或分支内容**
|
||||
|
||||
- 当从远程库进行克隆的时候,实际上已经将本地master分支和远程的master分支进行乐关联。
|
||||
|
||||
```
|
||||
git remote [-v]
|
||||
```
|
||||
可以显示与远程库关联的信息
|
||||
|
||||
```
|
||||
git push origin master
|
||||
```
|
||||
|
||||
推送分支,吧分支上的所有本地内容提交到远程库中的相同分支当中。
|
||||
|
||||
### **哪些分支需要推送**
|
||||
- mater分支是主分支,需要实时推送
|
||||
- dev是开发分支,所有成员都要在上面工作。也需要与远程同步。
|
||||
- bug分支只需要在本地修复bug,没有必要推送到远程。
|
||||
- feature分支,可以不用推送到远程。单人开发不用,夺人开发要推送到远程。
|
||||
|
||||
### **抓取分支或者分支的内容**
|
||||
|
||||
```
|
||||
git checkout -b dev origin/dev
|
||||
```
|
||||
可以用来抓取远程分支dev,这样会建立一个本地的本地的dev分支与远程的dev分支进行关联,可以直接实现dev分支的控制(push)
|
||||
|
||||
```
|
||||
git pull \<remote\> \<branch\>
|
||||
```
|
||||
|
||||
如果Git push失败,说明,当前的版本不是最新的版本。git pull
|
||||
可以将远程库中的最新版本拉去到本地。
|
||||
|
||||
```
|
||||
git branch --set-upstream dev origin/\<branch\>
|
||||
```
|
||||
这样会制定git的本地分支与远程的分支之间的链接。
|
||||
|
||||
- 如果git pull有冲突,与分支合并中解决冲突的方法一直。
|
||||
|
||||
### **多人协作的协作模式通常是这样:**
|
||||
|
||||
1. 首先,可以试图⽤git push origin branch-name推送自己的修改;
|
||||
2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
|
||||
3. 如果合并有冲突,则解决冲突,并在本地提交;
|
||||
4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
|
||||
5. 如果git pull提“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
|
||||
451
Git/git.md
451
Git/git.md
@@ -1,451 +0,0 @@
|
||||
Git的本地操作
|
||||
|
||||
> 参考文献
|
||||
> * [git使用教程](https://github.com/geeeeeeeeek/git-recipes/wiki)
|
||||
|
||||
## 1 git安装
|
||||
|
||||
- Linux上通过命令行能够很轻松的部署好git
|
||||
- Windows上需要安装GitBash,模拟linux命令行
|
||||
- 安装完成后需要配置全局信息的命令
|
||||
|
||||
```
|
||||
git config --global user.name "Your Name"
|
||||
git config --global user.email "email@example.com"
|
||||
```
|
||||
|
||||
## 2 创建版本库
|
||||
|
||||
```
|
||||
git init
|
||||
```
|
||||
生成.git文件,将这个目录初始化为一个版本的仓库。
|
||||
|
||||
```
|
||||
git add readme.txt
|
||||
```
|
||||
|
||||
将文件添加到缓冲区,可以连续多次向缓冲区中添加东西
|
||||
|
||||
```
|
||||
git commit -m "wrote a message"
|
||||
```
|
||||
将缓冲区的文件提交到历史记录当中当中,可以一次提交对缓冲区的多次修改。
|
||||
|
||||
## 3 时光穿梭机
|
||||
|
||||
```
|
||||
git status
|
||||
```
|
||||
|
||||
用来查看当前仓库的状态。主要有changes not staged for
|
||||
commit状态(工作区有变化没有提交),chages to be
|
||||
committed状态(缓存区有变化等待提价)
|
||||
|
||||
```
|
||||
git diff readme.txt
|
||||
```
|
||||
|
||||
用来对比工作区和历史记录内容的差别。
|
||||
|
||||
## 4 版本回退
|
||||
|
||||
```
|
||||
git log
|
||||
```
|
||||
用来查看版本的历史记录
|
||||
|
||||
```
|
||||
git log --pretty=oneline
|
||||
```
|
||||
|
||||
在一行显示历史记录
|
||||
|
||||
```
|
||||
git reset --hard HEAD\^
|
||||
```
|
||||
|
||||
回退到上一次的历史记录
|
||||
```
|
||||
git reset --hard id
|
||||
```
|
||||
|
||||
回退到指定id的版本
|
||||
|
||||
```
|
||||
git reflog
|
||||
```
|
||||
|
||||
用来查看所有操作的历史记录,可以使用reset命令去定位到任何版本
|
||||
|
||||
## 5 工作区和暂存区
|
||||
|
||||
### **概念理解**
|
||||
|
||||
- 工作区Wording Directory:在电脑中能够看到的目录,是工作区
|
||||
|
||||
- 版本库Repository:工作区有一个隐藏的目录.git是版本库
|
||||
|
||||
- 版本库中有Stage暂存区和master等分支以及一个纸箱master的指针HEAD
|
||||
|
||||
- git跟踪管理的是对文件的修改而并非文件本身
|
||||
|
||||
### **撤销修改**
|
||||
```
|
||||
git checkout --readme.txt
|
||||
```
|
||||
把readme.txt在工作区的修改全部撤销掉。如果缓存区有readme.txt的中间状态,则从缓存区恢复,如果缓存区没有readme.txt的中间状态,则从版本库中恢复。
|
||||
|
||||
```
|
||||
git reset HEAD readme.txt
|
||||
```
|
||||
把readmen.txt在缓存区的修改全部撤销掉。但是依然会保留工作区的修改。
|
||||
|
||||
### **删除文件**
|
||||
```
|
||||
git rm test.txt
|
||||
```
|
||||
|
||||
把某个文件从缓存区删掉,然后commit之后会从版本库删掉。如果删错了可以通过checkout从缓存区恢复这个文件。
|
||||
|
||||
## 7 Git的远程操作
|
||||
|
||||
远程操作主要是指,在不同的仓库之间进行提交和代码更改。是一个明显的对等的分布式系统。其中本地个仓库与远程仓库,不同的远程仓库之间都可以建立这种关系。这种关系之间的操作主要有pull和push。
|
||||
|
||||
### **远程仓库**
|
||||
|
||||
创建SSH key远程仓库和本地仓库一般是通过ssh通信的,需要ssh通信的加密钥匙。
|
||||
|
||||
id_rsa是私钥,id_rsa.pub是公钥,可以告诉别人。
|
||||
```
|
||||
ssh-keygen -t rsa -C 'yinkanglong@163.com'
|
||||
```
|
||||
|
||||
登录github,添加公钥内容。建立本地与远程仓库的通信协议
|
||||
|
||||
### **添加远程仓库**
|
||||
|
||||
github的界面操作可以很轻松的创建一个远程仓库。但如果想要直接上传自己本地的完整git库,必须创建一个没有lisence和readme的空库。
|
||||
|
||||
```
|
||||
git remote add origin git@github.com:michaelliao/learngit.git
|
||||
```
|
||||
将本地仓库和远程仓库进行关联。一般都叫远程关联仓库为origin,本地的主干分支一般名为master
|
||||
|
||||
```
|
||||
git push -u origin master
|
||||
```
|
||||
|
||||
将本地的主干分支master推送到远程的origin分支上。-u参数实现了两个分支的关联,将远程的git仓库的master和本地的master进行了分支管理,当再次执行时,只需要使用git
|
||||
push origin master命令。
|
||||
|
||||
### **从远程仓库克隆**
|
||||
|
||||
```
|
||||
git clone git@github.com:michaelliao/gitskills.git
|
||||
```
|
||||
|
||||
|
||||
### **git remote**
|
||||
|
||||
```
|
||||
git remote
|
||||
```
|
||||
|
||||
列出你和远程仓库之间的远程连接
|
||||
|
||||
```
|
||||
git remote -v
|
||||
```
|
||||
|
||||
列出每个连接的名字和url
|
||||
|
||||
```
|
||||
git remote add <name> <url>
|
||||
```
|
||||
|
||||
创建一个新的远程连接并添加名字
|
||||
```
|
||||
git remote rm <name>
|
||||
```
|
||||
|
||||
移除远程仓库的链接
|
||||
|
||||
### **git fetch**
|
||||
|
||||
```
|
||||
git fetch <remote>
|
||||
```
|
||||
|
||||
拉取仓库中的所有分支(包括相关的文件和所有的提交)
|
||||
```
|
||||
git fetch <remote> <branch>
|
||||
```
|
||||
|
||||
拉取制定仓库中的所有分支(包括相关的文件和所欲的提交)
|
||||
|
||||
> 注意,这个步骤知识拉取远程的分支,在本地并没有合并也没有生成本地分支,知识一个可读的远程分支。
|
||||
> * 使用git branch -r 命令可以查看所有只读的远程分支。
|
||||
> * 使用gitcheckout命令可以创建本地分支,并与远程分支关联。
|
||||
> * 使用git merge命令可以将远程分支与本地分支合并。
|
||||
|
||||
### **git pull**
|
||||
```
|
||||
git pull remote
|
||||
```
|
||||
|
||||
拉取当前分支对应的远程副本,并将远程副本的更改写入本地副本。相当于git fetch之后git merge。
|
||||
|
||||
```
|
||||
git pull -rebase \<remote\>
|
||||
```
|
||||
|
||||
使用git rebase命令合并远程分支与本地分支,不使用git merge
|
||||
|
||||
### **git push**
|
||||
|
||||
```
|
||||
git push <remote> \<branch\>
|
||||
```
|
||||
|
||||
将制定分支推送到远程分支。包括所有的文件和提交。
|
||||
|
||||
```
|
||||
git push <remote> --force
|
||||
```
|
||||
强制推送
|
||||
```
|
||||
git push <remote> --all
|
||||
```
|
||||
|
||||
本地所有的分支推送到远程仓库当中
|
||||
|
||||
```
|
||||
git push <remote> --tags
|
||||
```
|
||||
|
||||
将本地所有标签推送到远程仓库中
|
||||
|
||||
## 8 分支管理
|
||||
|
||||
这里主要体现的git的功能的分离,这才是真正的git吧。每一个分支都是一个单独的可以分离的工作单位。每个用户可以建立不同的分支进行工作,最终提交到同一个开发分支上。一个用户可以建立不同的分支实现不同的功能,最终提交到同一个用户分支上。分支的灵活性,可以让我们很容易的实现不同分工的分割。
|
||||
|
||||
### **创建分支**
|
||||
|
||||
```
|
||||
git checkout -b dev
|
||||
```
|
||||
创建分支,并且将工作目录切换到dev的工作目录上。
|
||||
|
||||
```
|
||||
git branch dev
|
||||
```
|
||||
使用当前版本分支创建新的分支(即添加一个分支指针)。
|
||||
```
|
||||
git checkout dev
|
||||
```
|
||||
将工作区切换到某一个分支指针所指的版本上。
|
||||
```
|
||||
git branch
|
||||
```
|
||||
会列出所有的分支目录。
|
||||
|
||||
### **分支合并**
|
||||
|
||||
```
|
||||
git merge dev
|
||||
```
|
||||
|
||||
将dev分支合并到当前工作目录下的分支上(不一定是产生他的父分支)
|
||||
```
|
||||
git branch -d dev
|
||||
```
|
||||
用来删除一个已经无效的分支指正,但是在这个分支指针上左右的操作都会保留。
|
||||
|
||||
### **解决冲突**
|
||||
|
||||
- 当合并过程中出现冲突,会进入长途解决工作区,手动解决后提交,就会退出。
|
||||
|
||||
- 关于一点,提交后的分支有必要继续工作吗,都行。完全可以提交后删掉重新创建一个分支,获取主干分支上集成的最新内容,然后继续工作。也可以直接在分支上合并一次主干分支,然后得到最新的内容,继续在原来的分支上进行工作。
|
||||
|
||||
```
|
||||
git log --graph
|
||||
```
|
||||
|
||||
可以查看分支合并图。
|
||||
|
||||
### **分支合并方式**
|
||||
```
|
||||
git merge --no-ff -m "merge messge" dev --no-ff
|
||||
```
|
||||
不适用fastfoward方式进行合并,会产生一个新的版本节点。加上-m参数,是因为这种方式合并过程中会自己提交合并后的版本。
|
||||
|
||||
### **分支管理**
|
||||
|
||||
- 团队合作的分支管理组图就是你们要的方式
|
||||
|
||||

|
||||
|
||||
### **BUG分支**
|
||||
|
||||
- 因为总会在自己工作的过程中出现紧急的需要更改的bug,但是现在工作区中的内容还不能提交,所以必须生成现在工作区的一个快照,等处理完紧急的bug之后,再来回复工作区的内容。
|
||||
|
||||
```
|
||||
git stash
|
||||
```
|
||||
将当前的工作现场储存起来,等到修复完成bug之后可以再次进行更改。工作现场包括工作区和stage缓存区。然后可以清空工作区和缓存区的内容,新建bug分支进行工作。
|
||||
|
||||
```
|
||||
git stash list
|
||||
```
|
||||
用来查看保存中的工作区。
|
||||
|
||||
```
|
||||
git stash apply stash@{0}
|
||||
```
|
||||
恢复stash内容,但并不清楚stash列表中的内容。
|
||||
|
||||
```
|
||||
get stash drop
|
||||
```
|
||||
用来删除stash列表中的内容。(因为已经恢复或者没有必要恢复)
|
||||
|
||||
```
|
||||
git stash pop
|
||||
```
|
||||
可以用来弹出stash列表中的内容。
|
||||
|
||||
### **Feature分支**
|
||||
|
||||
- 当添加一个新的功能的时候,因为是一些实验性的代码,所以要创建一个单独的分支进行处理。
|
||||
|
||||
- git checkout -b feature-vulcan
|
||||
|
||||
创建一个新的功能分支
|
||||
```
|
||||
git status
|
||||
|
||||
git add vulcan.py
|
||||
|
||||
git commit -m "add feature vulcan"
|
||||
|
||||
git checkout dev
|
||||
|
||||
git merge vulcan.py
|
||||
|
||||
git branch -D feature-vulcan 不合并,强制删除
|
||||
```
|
||||
## 9 多人协作
|
||||
|
||||
通过远程库的push和pull操作实现夺人合作
|
||||
|
||||
### **推送分支或分支内容**
|
||||
|
||||
- 当从远程库进行克隆的时候,实际上已经将本地master分支和远程的master分支进行乐关联。
|
||||
|
||||
```
|
||||
git remote [-v]
|
||||
```
|
||||
可以显示与远程库关联的信息
|
||||
|
||||
```
|
||||
git push origin master
|
||||
```
|
||||
|
||||
推送分支,吧分支上的所有本地内容提交到远程库中的相同分支当中。
|
||||
|
||||
### **哪些分支需要推送**
|
||||
- mater分支是主分支,需要实时推送
|
||||
- dev是开发分支,所有成员都要在上面工作。也需要与远程同步。
|
||||
- bug分支只需要在本地修复bug,没有必要推送到远程。
|
||||
- feature分支,可以不用推送到远程。单人开发不用,夺人开发要推送到远程。
|
||||
|
||||
### **抓取分支或者分支的内容**
|
||||
|
||||
```
|
||||
git checkout -b dev origin/dev
|
||||
```
|
||||
可以用来抓取远程分支dev,这样会建立一个本地的本地的dev分支与远程的dev分支进行关联,可以直接实现dev分支的控制(push)
|
||||
|
||||
```
|
||||
git pull \<remote\> \<branch\>
|
||||
```
|
||||
|
||||
如果Git push失败,说明,当前的版本不是最新的版本。git pull
|
||||
可以将远程库中的最新版本拉去到本地。
|
||||
|
||||
```
|
||||
git branch --set-upstream dev origin/\<branch\>
|
||||
```
|
||||
这样会制定git的本地分支与远程的分支之间的链接。
|
||||
|
||||
- 如果git pull有冲突,与分支合并中解决冲突的方法一直。
|
||||
|
||||
### **多人协作的协作模式通常是这样:**
|
||||
|
||||
1. 首先,可以试图⽤git push origin branch-name推送自己的修改;
|
||||
2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
|
||||
3. 如果合并有冲突,则解决冲突,并在本地提交;
|
||||
4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
|
||||
5. 如果git pull提“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
|
||||
|
||||
## 10 标签管理
|
||||
|
||||
### **创建标签**
|
||||
|
||||
```
|
||||
git tag v1.0
|
||||
```
|
||||
|
||||
对当前版本打标签,为v1.0
|
||||
|
||||
```
|
||||
git tag
|
||||
```
|
||||
查看所有已经创建的标签
|
||||
|
||||
```
|
||||
git tag v0.9 6.225
|
||||
```
|
||||
|
||||
对指定id的版本打标签
|
||||
```
|
||||
git show v0.9
|
||||
```
|
||||
|
||||
查看标签信息
|
||||
|
||||
```
|
||||
git tag -a v0.1 -m "version 0.1 released" 3628164
|
||||
```
|
||||
|
||||
创建带有标签说明的标签
|
||||
|
||||
### **操作标签**
|
||||
|
||||
```
|
||||
git tag -d v0.1
|
||||
```
|
||||
|
||||
删除制定版本的标签
|
||||
|
||||
```
|
||||
git push origin v1.0
|
||||
```
|
||||
|
||||
推送某个标签到远程
|
||||
|
||||
```
|
||||
git push origin --tags
|
||||
```
|
||||
|
||||
一次性推送所有标签。
|
||||
|
||||
```
|
||||
git tag -d v0.9
|
||||
|
||||
git push origin :refs/tags/v0.9
|
||||
```
|
||||
|
||||
从远程删除标签,先在本地删除标签,然后将操作推送到远程。
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* Github主页仓库主页——仓库相关的信息和相关操作
|
||||
|
||||
## 2 pull request
|
||||
## 2 fork sycnize
|
||||
## 2 fork syncize
|
||||
|
||||
> 参考文献
|
||||
> * [https://blog.csdn.net/qq_22918243/article/details/89642445](https://blog.csdn.net/qq_22918243/article/details/89642445)
|
||||
|
||||
BIN
Git/image/2021-06-15-11-04-57.png
Normal file
BIN
Git/image/2021-06-15-11-04-57.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
Reference in New Issue
Block a user