-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
d5ae3c8
commit e411e3c
Showing
6 changed files
with
596 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,7 +14,7 @@ tags: | |
{:toc} | ||
|
||
|
||
### 1 github使用指南 | ||
|
||
|
||
|
||
|
||
|
@@ -25,13 +25,17 @@ tags: | |
|
||
|
||
版本控制是什么? | ||
一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统 | ||
|
||
- 一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统 | ||
|
||
为什么需要版本控制? | ||
更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生也能够随时切换到不同的版本,回滚误删误改的问题代码; | ||
|
||
- 更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生也能够随时切换到不同的版本,回滚误删误改的问题代码; | ||
|
||
|
||
|
||
什么是 git | ||
|
||
- Git 是一款免费、开源的分布式版本控制系统,他是著名的 Linux 发明者 Linus Torvalds 开发的 | ||
- GitHub 主要提供基于 git 的**版本托管**服务。也就是说现在 GitHub 上托管的所有项目代码都是基于 Git 来进行版本控制的,所以 Git 只是 GitHub 上用来管理项目的一个工具而已,GitHub 的功能可远不止于此! | ||
|
||
|
@@ -86,6 +90,12 @@ Gist | |
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#### 1.2 git 目录结构 | ||
|
||
- Git 的本质是一个**文件系统**,工作目录中的所有文件的**历史版本**以及**提交记录**(commit)都是以文件对象的方式保存在 `.git` 目录中的。 | ||
|
@@ -176,31 +186,45 @@ git remote add origin 仓库名 | |
|
||
|
||
|
||
#### 远端仓库/ remote | ||
Git 有三种状态,你的文件可能处于其中之一: 已提交(committed)、已修改(modified) 和 已暂存(staged)。 | ||
|
||
- 已修改表示**修改**了文件,但还没保存到数据库中。 | ||
- 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。 | ||
- 已提交表示数据已经安全地保存在本地数据库中。 | ||
|
||
|
||
|
||
|
||
|
||
### 2 远端仓库/ remote | ||
|
||
#### 2.1 http 和 git 协议有什么区别 | ||
|
||
- 第一组使用 HTTPS 协议,第二组使用 SSH 协议。具体选择哪种协议取决于你的需求和配置。 | ||
- 使用 HTTPS 协议需要提供**用户名和密码**,而使用 SSH 协议则需要设置密钥对。 | ||
|
||
```bash | ||
以下两者有什么区别 git remote -v | ||
# 用于查看当前项目中配置的所有远程仓库的详细信息。 | ||
git remote -v | ||
origin https://github.com/*****/tinywebserver (fetch) | ||
origin https://github.com/*****/tinywebserver (push) | ||
origin [email protected]:*****/simple-douyin.git (fetch) | ||
origin [email protected]:*****/simple-douyin.git (push) | ||
``` | ||
|
||
其中 | ||
|
||
- `fetch`:`git fetch` 命令用于从远程仓库获取最新的代码和提交历史,但不会自动合并或更新你的本地分支。它将远程仓库的内容下载到你的本地仓库,使你能够查看和**比较**远程分支与本地分支之间的差异。`fetch` 操作**不会修改**你的本地分支,只会更新你的本地仓库。 | ||
- `push`:`git push` 命令用于将你的本地分支的提交推送到远程仓库。它将你的本地分支的提交上传到远程仓库,并将远程仓库的相应分支更新为你的提交。`push` 操作会修改远程仓库的内容。 | ||
|
||
1. `fetch`:`git fetch` 命令用于从远程仓库获取最新的代码和提交历史,但不会自动合并或更新你的本地分支。它将远程仓库的内容下载到你的本地仓库,使你能够查看和**比较**远程分支与本地分支之间的差异。`fetch` 操作**不会修改**你的本地分支,只会更新你的本地仓库。 | ||
2. `push`:`git push` 命令用于将你的本地分支的提交推送到远程仓库。它将你的本地分支的提交上传到远程仓库,并将远程仓库的相应分支更新为你的提交。`push` 操作会修改远程仓库的内容。 | ||
|
||
```bash | ||
# 用于查看当前项目中配置的所有远程仓库的详细信息。 | ||
git remote -v | ||
|
||
git remote add origin_ssh [email protected]: git/git.git | ||
git remote add origin_http https://github. com/git/git.git | ||
#### 2.2 链接远程仓库 | ||
|
||
```bash | ||
# 链接远程仓库,使通过网络与远程仓库进行交互。 | ||
git remote add <remote_name> <remote_url> | ||
# 设置fetch 和 push 为不同的仓库 | ||
git remote set-url --add --push origin git@github. com: my_repo/git.git | ||
|
@@ -210,6 +234,8 @@ git remote set-url --add --push origin git@github. com: my_repo/git.git | |
|
||
|
||
|
||
|
||
|
||
#### 查看文件内容 | ||
|
||
`git cat-file` 是一个用于查看 Git 对象内容的命令。Git 中的对象是存储在仓库中的基本数据单元,包括提交(commit)、树(tree)、标签(tag)和文件内容(blob)等。 | ||
|
@@ -238,7 +264,9 @@ git remote set-url --add --push origin git@github. com: my_repo/git.git | |
|
||
|
||
|
||
#### 分支操作 | ||
### 3 分支操作 | ||
|
||
#### 3.1 本地操作分支 | ||
|
||
```bash | ||
# 查看本地分支列表 | ||
|
@@ -249,24 +277,21 @@ git branch -r | |
# 新建一个叫 develop 的分支 | ||
git branch develop | ||
# 创建一个名为 "test" 的新分支,并从 "master" 分支进行分叉。 | ||
git branch test master | ||
# 切换 到 dev 分支 | ||
git checkout dev | ||
# 新建并且自动切换到 develop 分支 | ||
git checkout -b dev | ||
# 删除本地分支 | ||
git branch -d develop | ||
# 删除远程分支 | ||
git push origin :develop | ||
# 新建并且自动切换到 develop 分支 | ||
git checkout -b dev | ||
# 把 develop 分支推送到远程仓库 | ||
git push origin develop | ||
# 如果你远程的分支想取名叫 develop2 ,那执行以下代码: | ||
git push origin develop:develop2 | ||
#用来切换tag | ||
git checkout v1.0 | ||
|
@@ -282,7 +307,60 @@ git tag v0.0.1 | |
|
||
|
||
|
||
合并分支 | ||
|
||
|
||
#### 3.2 想拉取远程仓库的 dev 分支怎么做 | ||
|
||
要拉取远程仓库的 dev 分支,可以按照以下步骤进行操作: | ||
|
||
```bash | ||
git fetch origin dev | ||
``` | ||
|
||
|
||
|
||
1. 使用 git fetch origin dev 命令从远程仓库拉取 dev 分支的最新代码。这将会将远程仓库的 dev 分支代码下载到你本地仓库,不会自动合并到你当前的分支。 | ||
2. 使用 git checkout dev 命令切换到 dev 分支。如果本地还没有 dev 分支,可以使用 git checkout -b dev origin/dev 命令创建并切换到 dev 分支。 | ||
|
||
现在你已经成功拉取了远程仓库的 dev 分支,可以开始在本地与该分支进行开发和修改。记得在操作前先保存好本地的修改,以免冲突。 | ||
|
||
|
||
|
||
|
||
|
||
#### 3.3 远程分支 | ||
|
||
- 远程分支**没有新建**指令, 直接 **push** 就好 | ||
|
||
```bash | ||
# 删除远程分支 | ||
git push origin --delete publish | ||
# 通过将 <source> 设置为空,就表示没有要推送的本地分支,而只是请求删除远程分支 | ||
git push origin :develop | ||
# 如果你远程的分支想取名叫 develop2 ,那执行以下代码: | ||
git push origin develop:develop2 | ||
# 把 develop 分支推送到远程仓库 | ||
git push origin develop | ||
``` | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#### 3.4 合并分支 | ||
|
||
- Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 **快照** 。在进行提交操作时,Git 会保存一个提交对象(commit object)。 | ||
- Git 的分支,其实本质上仅仅是指向**提交对象**的可变**指针**。 | ||
- Git 又是怎么知道当前在哪一个分支上呢? 也很简单,它有一个名为 HEAD 的特殊指针。指向当前所在的本地分支(译注:将 HEAD 想象为当前分支的别名)。 | ||
- 由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。 | ||
|
||
|
||
|
||
|
||
|
||
```bash | ||
# 我们在一个 featureA 分支开发完了一个功能,这个时候需要合并到主分支 master 上去 | ||
|
@@ -302,6 +380,134 @@ git rebase featureA | |
|
||
|
||
|
||
|
||
|
||
#### 3.5 遇到冲突时的分支合并 | ||
|
||
- 有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对**同一个文件**的同一个部分进行了不同的修改,Git 就没法干净的合并它们。 | ||
- 此时 Git 做了合并,但是**没有自动地创建一个新的合并提交**。 Git 会**暂停**下来,等待你去**解决**合并产生的**冲突**。 | ||
|
||
|
||
|
||
```bash | ||
# 现在在 master分支, 想要合并 dev 的内容 | ||
$ git merge dev | ||
Auto-merging index.html | ||
CONFLICT (content): Merge conflict in index.html | ||
Automatic merge failed; fix conflicts and then commit the result. | ||
$ 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: index.html | ||
no changes added to commit (use "git add" and/or "git commit -a") | ||
``` | ||
|
||
|
||
|
||
任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加入标准的冲突 | ||
解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。 出现冲突的文件会包含一些特殊区段,看 | ||
起来像下面这个样子: | ||
|
||
```bash | ||
# HEAD 所指向的版本 | ||
<<<<<<< HEAD:index.html | ||
<div id="footer">contact : [email protected]</div> | ||
======= | ||
# 合并所指向的版本 | ||
<div id="footer"> | ||
please contact us at [email protected] | ||
</div> | ||
>>>>>>> iss53:index.html | ||
``` | ||
|
||
为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内 | ||
容。同时 `<<<<<<<` ,` =======` , 和 `>>>>>>>` 这些行被**完全删除**了。 | ||
#### 3.6 多人合作冲突 | ||
远程跟踪分支是远程分支状态的引用。它们是你无法移动的本地引用。一旦你进行了网络通信, Git 就会为你移 | ||
动它们以精确反映远程仓库的状态。它们以\<remote>/\<branch> 的形式命名。 | ||
假设你的网络里有一个在 `git.ourcompany.com 的 Git` 服务器。 如果你从这里克隆,Git 的 clone 命令会为你自动将其命名为 origin,拉取它的所有数据, 创建一个指向它的 `master `分支的指针,并且在本地将其命名为 `origin/master`。Git 也会给你一个与 origin 的master 分支在指向同一个地方的本地 master 分支,这样你就有工作的基础。 | ||
隔离性 | ||
- 如果你在本地的 master 分支做了一些工作,在同一段时间内有其他人推送**提交**到 `git.ourcompany.com` 并且**更新**了它的 master 分支,这就是说你们的提交历史已走向不同的方向。 即便这样,只要你保持不与origin 服务器连接(并拉取数据),你的 origin/master 指针就不会移动。 | ||
- 如果要与给定的远程仓库**同步数据**,运行 `git fetch <remote> `命令 | ||
### 常见开发场景 | ||
#### 1、本地仓库有文件,远程服务器上面是新建的仓库 | ||
```bash | ||
# 1 初始化仓库 | ||
git init test | ||
|
||
# 2 在仓库中新建文件编辑内容(例如test.txt) | ||
|
||
# 3 添加到暂存区 | ||
git add test.txt | ||
|
||
# 提交修改 | ||
git commit test.txt -m '提交test.txt' | ||
|
||
# 关联远程仓库, origin也是默认仓库的名字,也可以命名为其它的名字 | ||
git remote add origin [email protected]:blueses/test.git | ||
|
||
# 把本地仓库的master分支与远程仓库的master分支关联起来 | ||
# 把本地仓库的master分支的文件推送到远程仓库的master分支中 | ||
git push -u origin master | ||
|
||
|
||
``` | ||
|
||
|
||
|
||
|
||
|
||
#### 2、远程服务器上面有很多代码,要拉取到本地开始开发 | ||
|
||
```bash | ||
# 直接克隆 | ||
git clone [email protected]:blueses/test.git | ||
|
||
# add、commit、pull、push 三步走 | ||
``` | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
### 其他操作 | ||
|
||
#### 提交操作 | ||
|
||
```bash | ||
|
@@ -328,15 +534,15 @@ filter --branch | |
|
||
```bash | ||
git reflog expire --expire=now --all | ||
git gc --prune=now | ||
git gc --prune=now | ||
|
||
``` | ||
|
||
|
||
|
||
|
||
|
||
#### 拉取操作 | ||
#### 拉取操作概念辨析 | ||
|
||
- `Clone`拉取完整的仓库到本地目录,可以指定分支,深度. | ||
- `Fetch`将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.