Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
官网: Git - Downloads (git-scm.com)
没有设置用户签名无法提交和克隆代码
git config --global user.name 用户名
git config --global user.email 邮箱
语法:git init
初始化后,当前目录会生成一个.git隐藏文件夹
19407@test-com MINGW64 /e/GitSpase/git-test
$ git init
Initialized empty Git repository in E:/GitSpase/git-test/.git/
19407@test-com MINGW64 /e/GitSpase/git-test (master)
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ ls -lha
total 4.0K
drwxr-xr-x 1 19407 197609 0 Feb 28 22:32 ./
drwxr-xr-x 1 19407 197609 0 Feb 28 22:32 ../
drwxr-xr-x 1 19407 197609 0 Feb 28 22:32 .git/
查看仓库当前的状态,显示有变更的文件。
语法:git status
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
有文件变更
$ git status
On branch master
No commits yet
Untracked files:
(use "git add ..." to include in what will be committed)
hellogit.txt
nothing added to commit but untracked files present (use "git add" to track)
有文件添加到暂存区
$git add hellogit.txt
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached ..." to unstage)
new file: hellogit.txt
提交到本地库
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git commit -m "first commit" hellogit.txt
[master (root-commit) 986145a] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hellogit.txt
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
nothing to commit, working tree clean
语法:git add 文件名
$git add hellogit.txt
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached ..." to unstage)
new file: hellogit.txt
语法:git rm --cached 文件名
$ git rm --cached hello.txt
rm 'hello.txt'
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
Untracked files:
(use "git add ..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
语法:git commit -m "日志信息" 文件名
$ git commit -m "first commit hello.txt" hello.txt
[master 2adb22d] first commit hello.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hello.txt
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
nothing to commit, working tree clean
语法:git reflog
$ git reflog
2adb22d (HEAD -> master) HEAD@{0}: commit: first commit hello.txt
986145a HEAD@{1}: commit (initial): first commit
查看详细日志
语法:git log
$ git log
commit 2adb22d3bac5e674cc2704d06a37e1934b3c274f (HEAD -> master)
Author: xxxxx <[email protected]>
Date: Tue Feb 28 23:23:40 2023 +0800
first commit hello.txt
commit 986145a324c080df679732067de67c6638ff3649
Author: xxxxx <[email protected]>
Date: Tue Feb 28 23:15:31 2023 +0800
first commit
语法:git reset --hard 版本号
$ git reflog
ba4516b (HEAD -> master) HEAD@{0}: commit: second commit #当前版本
8b45283 HEAD@{1}: commit (initial): first commit
## 切换到第一次提交的版本
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git reset --hard 8b45283
HEAD is now at 8b45283 first commit
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ vim test.txt
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git reflog
8b45283 (HEAD -> master) HEAD@{0}: reset: moving to 8b45283
ba4516b HEAD@{1}: commit: second commit #之前版本
8b45283 (HEAD -> master) HEAD@{2}: commit (initial): first commit #现在版本
几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。对于初学者而言,分支可以理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
语法:git branch [-v]
$ git branch -v
* master 8b45283 first commit
$ git branch
hot-fix
* master
语法:git branch 分支名
$ git branch hot-fix
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git branch -v
hot-fix 8b45283 first commit
* master 8b45283 first commit
语法:git checkout 分支名
$ git branch -v
hot-fix 8b45283 first commit
* master 8b45283 first commit
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
19407@test-com MINGW64 /e/GitSpase/git-test (hot-fix)
$ git branch -v
* hot-fix 8b45283 first commit
master 8b45283 first commit
语法:git branch -d 分支名
$ git branch -d hot-fix
Deleted branch hot-fix (was 8b45283).
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git branch
* master
语法:git merge 分支名
正常合并
19407@test-com MINGW64 /e/GitSpase/git-test (hot-fix)
$ git checkout master
Switched to branch 'master'
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ cat test.txt
master first
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git merge hot-fix
Updating 9b74a53..852ce1e
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ cat test.txt
master first
hot-fix first
合并冲突
原因: 合并分支行时,两个分支在同一个文件的同一个位置有两套不同的修改,git无法决定使用哪个修改
master|MERGING
表示当前正在合并,但无法合并
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git merge hot-fix
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
19407@test-com MINGW64 /e/GitSpase/git-test (master|MERGING)
$ cat test.txt
master first
hot-fix first
<<<<<<< HEAD
master second
=======
hot-fix second
>>>>>>> hot-fix
19407@test-com MINGW64 /e/GitSpase/git-test (master|MERGING)
#当前本地库状态
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: test.txt
此时需要手动处理冲突
master first
hot-fix first
<<<<<<< HEAD
master second
=======
hot-fix second
>>>>>>> hot-fix
# 处理要处理的代码
master first
hot-fix first
master second
hot-fix second
添加到暂存区
$ git add test.txt
19407@test-com MINGW64 /e/GitSpase/git-test (master|MERGING)
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: test.txt
执行提交(此时使用commit不能带文件名)
$ git commit -m "merge test"
[master 6a5732c] merge test
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
nothing to commit, working tree clean
可以将远程库地址设置别名,方便使用
语法:git remote -v
查看当前所有远程地址别名
git remote add 别名 远程地址
添加远程库别名
$ git remote add git-test https://gitee.com/YananK/git-test.git
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git remote -v
git-test https://gitee.com/YananK/git-test.git (fetch)
git-test https://gitee.com/YananK/git-test.git (push)
语法:git push 别名/地址 分支
$ git remote -v
git-demo [email protected]:ZnShiJie/git-demo.git (fetch)
git-demo [email protected]:ZnShiJie/git-demo.git (push)
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git push git-demo master
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (15/15), 1.13 KiB | 384.00 KiB/s, done.
Total 15 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), done.
To github.com:ZnShiJie/git-demo.git
* [new branch] master -> master
语法: git pull 别名/地址 分支名
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git pull git-demo master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 682 bytes | 45.00 KiB/s, done.
From github.com:ZnShiJie/git-demo
* branch master -> FETCH_HEAD
6a5732c..f22f778 master -> git-demo/master
Updating 6a5732c..f22f778
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ cat test.txt
master first
hot-fix first
master second
hot-fix second
在github上修改了
语法:git clone 远程地址
19407@test-com MINGW64 /e/GitSpase
$ git clone https://github.com/ZnShiJie/git-demo.git
Cloning into 'git-demo'...
fatal: unable to access 'https://github.com/ZnShiJie/git-demo.git/': OpenSSL SSL_read: Connection was reset, errno 10054
19407@test-com MINGW64 /e/GitSpase
$ git clone https://github.com/ZnShiJie/git-demo.git
Cloning into 'git-demo'...
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 18 (delta 2), reused 14 (delta 1), pack-reused 0
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (2/2), done.
19407@test-com MINGW64 /e/GitSpase
$ cd git-demo/
github由于服务器问题,可能会出现克隆失败
fatal: unable to access ‘https://github.com/ZnShiJie/git-demo.git/’: OpenSSL SSL_read: Connection was reset, errno 10054