本地结构包括工作区、暂存区以及本地库。
工作区用于存储当前写的这些代码,暂存区存储将要提交上去的代码暂存区的代码还是可以撤回的,本地库存储的是每个历史版本的信息。
将工作区代码提交到暂存区
git add
将暂存区的代码提交到本地库
git commit
其作用为帮助我们维护远程库
1)项目经理现在自己的本地库中创建项目
2)项目经理将本地库中的代码push到远程库中
3)开发人员可以从远程库中将代码clone到自己的本地库
4)开发人员写完后需要加入该团队才可以将代码push 到远程库中
5)之后项目经理就可以从远程库中将程序员提交的内容pull下来
创建者公司拥有一个远程库,协助者亦拥有一个远程库,协助开发的公司的远程库想要在创建者公司基础上开发需要进行fork操作获得其完整的代码,当其完成需求想要同步到创建者的远程库时,其会先发起拉取请求,然后创建者进行审核,没问题时采用merge操作将内容合并到自己的远程库中。
设置签名:设置用户名与邮箱
wg@DESKTOP-AQLVI3K MINGW64 /e
$ git config --global user.name "wg"
wg@DESKTOP-AQLVI3K MINGW64 /e
$ git config --global user.email "gw_9527@163.com"
仓库初始化
wg@DESKTOP-AQLVI3K MINGW64 /e/GitResp
$ git init
Initialized empty Git repository in E:/GitResp/.git/
git只能管理暂存区和本地库中的文件。
首先在工作区中创建Demo.md的文件,然后使用git add将文件推到暂存区。
wg@DESKTOP-AQLVI3K MINGW64 /e/GitResp (master)
$ git add Demo.md
再将暂存区的文件提交到本地库。
$ git commit -m "这是我写的第一个文件 Demo.md" Demo.md
[master (root-commit) 6df164a] 杩欐槸鎴戝啓鐨勭涓€涓枃浠?Demo.md
1 file changed, 1 insertion(+)
create mode 100644 Demo.md
-m 用于给当前的提交加注释。
查看工作区
对于提交本地库之后,修改文件的数据后,执行git status就会出现git已经发现你修改了文件
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: Demo.md
no changes added to commit (use "git add" and/or "git commit -a")
此时需要再次add,commit
$ git log
commit 7e328f841e08439649d4281ac6373ac50dec397d (HEAD -> master)
Author: wg <gw_9527@163.com>
Date: Fri Nov 20 10:52:33 2020 +0800
修改了demo.md中的内容
commit 6df164a4e39d8bc72d5eaaa4d8d76dded12d6622
Author: wg <gw_9527@163.com>
Date: Fri Nov 20 10:33:28 2020 +0800
这是我写的第一个文件 Demo.md
7e328f841e08439649d4281ac6373ac50dec397d 为该版本的key,真实数据为value。
一行显示
$ git log --pretty=oneline
7e328f841e08439649d4281ac6373ac50dec397d (HEAD -> master) 修改了demo.md中的内容
6df164a4e39d8bc72d5eaaa4d8d76dded12d6622 这是我写的第一个文件 Demo.md
wg@DESKTOP-AQLVI3K MINGW64 /e/GitResp (master)
$ git log --oneline
7e328f8 (HEAD -> master) 修改了demo.md中的内容
6df164a 这是我写的第一个文件 Demo.md
$ git reflog
7e328f8 (HEAD -> master) HEAD@{0}: commit: 修改了demo.md中的内容
6df164a HEAD@{1}: commit (initial): 这是我写的第一个文件 Demo.md
HEAD@{1}为由当前版本回退到该版本需要回退一个版本。
回退到之前的版本
$ git reflog
80c8de4 (HEAD -> master) HEAD@{0}: commit: test.md中插入了dddfef
16cd72a HEAD@{1}: commit: test.md中插入了abcdefg
3e2d86f HEAD@{2}: commit: 创建了test.md
4a71c44 HEAD@{3}: commit: 第三次修改demo.md
7e328f8 HEAD@{4}: commit: 修改了demo.md中的内容
6df164a HEAD@{5}: commit (initial): 这是我写的第一个文件 Demo.md
wg@DESKTOP-AQLVI3K MINGW64 /e/GitResp (master)
$ git reset --hard 16cd72a
HEAD is now at 16cd72a test.md涓彃鍏ヤ簡abcdefg
hard之后写的是版本号。
版本号除了可以写之前的版本号,回退之后,亦可以填之后的版本号又退到后面。
git reset --hard[索引号]
使用hard参数时,会将此时的工作区,暂存区以及本地库中信息都修改了。
git reset --mixed[索引号]
只修改本地库以及暂存区,不会修改工作区.
git reset --soft[索引号]
只修改本地库,暂存区工作区都不会被修改。
// 删除工作区的文件
$ rm test1.md
// 将改文件的删除操作同步到暂存区
$ git add test1.md
// 将改文件的删除操作同步到本地库
$ git commit -m "删除test1.md文件" test1.md
[master ce54d21] 鍒犻櫎test1.md鏂囦欢
1 file changed, 1 deletion(-)
delete mode 100644 test1.md
$ git reflog
ce54d21 (HEAD -> master) HEAD@{0}: commit: 删除test1.md文件
8d09d2f HEAD@{1}: commit: 创建了test1.md
$ git reset --hard 8d09d2f
只需将历史版本切换到删除前的那个版本即可。
用于比对文件的差异
test2.md提交到本地库后,将工作区中内容修改,在aaaaa之后增加bbb字符。
使用diff命令后,发现暂存区和工作区中改文件的差异为:先删除了aaaaa这一行,再增加的aaaaabbb这一行,这是由于git是按行为单位来管理数据的。
$ git diff test2.md
diff --git a/test2.md b/test2.md
index e4a7dd9..ac799e9 100644
--- a/test2.md
+++ b/test2.md
@@ -1 +1 @@
-aaaaa
\ No newline at end of file
+aaaaabbb
\ No newline at end of file
比较工作区与暂存区的文件,若不加文件名则比较多个文件之间的差异
git diff [文件名]
比较暂存区与本地库某个版本之间的文件差异
git diff [历史版本] [文件名]
版本控制过程中,使用多条线同时推进多个任务,多条线指的就是分支的概念。
多个分支可以并行工作,互不干扰,互不影响。
若上图所示,当需要添加一个新功能时创建一个分支,该分支从主分支复制而来,当新功能代码撰写完毕后再将该分支合并到主分支上面去,此外当主分支运行出现bug时从主分支开辟一个新的分支,再新的分支上debug,修复完毕后再将该分支合并到主分支。
创建分支
$ git branch [新创建的分支名]
查看分支
$ git branch -v
切换分支
$ git checkout [目标分支名]
分支合并,在主分支中执行如下命令
$ git merge [待合并的分支名]
当主分支以其他分支出现冲突(即两个分支修改了同一个文件)时
$ git merge branch01
Auto-merging test3.md
CONFLICT (content): Merge conflict in test3.md
Automatic merge failed; fix conflicts and then commit the result.
wg@DESKTOP-AQLVI3K MINGW64 /e/GitResp (master|MERGING)
执行完合并之后,此时处于(master|MERGING)状态。
解决:人为决定在工作区修改出现冲突的文件。并add commit
// 次数commit不需要带文件名
wg@DESKTOP-AQLVI3K MINGW64 /e/GitResp (master|MERGING)
$ git commit -m "解决了冲突处理"
[master b37fde2] 瑙e喅浜嗗啿绐佸鐞?
// commit之后状态就发生改变
wg@DESKTOP-AQLVI3K MINGW64 /e/GitResp (master)
使用github作为远程库。
为远程库起别个名:此处的origin为起的别名
$ git remote add origin https://github.com/gw7868/GitResp2.git
$ git remote -v
origin https://github.com/gw7868/GitResp2.git (fetch)
origin https://github.com/gw7868/GitResp2.git (push)
push操作
将本地库内容推送到远程库
git push [远程库的地址] [待推送的分支]
$ git push origin master
Logon failed, use ctrl+c to cancel basic credential prompt.
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 222 bytes | 7.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/gw7868/GitResp2.git
* [new branch] master -> master
clone操作
git clone [远程库的地址]
克隆之后,
1) 初始化本地库
2)完成远程库内容复制
3)远程库的别名亦复制
pull操作
是拉取和合并两个操作。
git pull [远程库地址] [分支名]
冲突解决
与分支合并时冲突类似,当其他人修改了改文件时并推送到远程库时,此时再对本地库中改文件修改再进行push时会出现冲突。
对于该情况首先拉取最新版本,此时本地库中会出现(master | merge)状态,和解决分支间冲突类似,在工作区人为修改改文件并提交到本地库再次推送即可。