Git

简介:免费的分布式版本管理系统

创建版本库

$ cd 目录(进入某个本地目录)
$ mkdir learngit(在该目录内创建learngit空文件夹)
$ cd learngit(进入learngit文件夹)
$ pwd(查看当前所在路径)
$ git init(将该目录变为Git可管理的仓库)

把文件添加到版本库

使用NotePad++来创建、修改文本文件(UTF-8)

1、编写一个readme.txt文件,内容为:
Git is a version control system.
Git is free software.

$ git add readme.txt(添加文件)
$ git commit -m “wrote a readme file”(把文件提交到仓库,-m后面输入说明文字)
[master (root-commit) 3a43b3e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
(可多次add文件,再统一commit一次)

2、修改readme.txt文件:
Git is a distributed version control system.
Git is free software.

运行git status命令查看结果:
$ git status(查看仓库当前状态)
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git restore …” to discard changes in working directory)
modified: readme.txt

no changes added to commit (use “git add” and/or “git commit -a”)

3、查看修改内容:
$ git diff(查看修改内容)
diff --git a/readme.txt b/readme.txt
index d8036c1…013b5bc 100644
— a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.

4、提交刚才修改过的文件:
$ git add readme.txt

5、查看状态:
$ git status
On branch master
Changes to be committed:
(use “git restore --staged …” to unstage)
modified: readme.txt

6、提交文件:
$ git commit -m “add distributed”
[master 27e7555] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)

7、再查看状态:
$ git status
On branch master
nothing to commit, working tree clean

8、再次修改文件:
Git is a distributed version control system.
Git is free software distributed under the GPL.

9、提交:
$ git add readme.txt
$ git commit -m “append GPL”

[master 1094adb] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)

10、用git log命令查看修改记录:
$ git log(查看修改记录)
commit 65dde849858c7e433fefdbef636b4ea759f98231 (HEAD -> master)
Author: XXX
Date: Mon Nov 18 12:40:24 2019 +0800

append GPL

commit 27e75555a3fd877992cc8a67aa03565d0187347d
Author: XXX
Date: Mon Nov 18 12:38:54 2019 +0800

add distributed

commit 3a43b3eb79536e15486dba4346c2ff318d066f43
Author: XXX
Date: Mon Nov 18 12:35:58 2019 +0800

wrote a readme file

11、可用–pretty=oneline参数简化显示:
$ git log --pretty=oneline
65dde849858c7e433fefdbef636b4ea759f98231 (HEAD -> master) append GPL
27e75555a3fd877992cc8a67aa03565d0187347d add distributed
3a43b3eb79536e15486dba4346c2ff318d066f43 wrote a readme file
(前面一大串数字字母为版本号)

版本回退

1、使用git reset --hard HEAD^命令可回退到前一版本:
$ git reset --hard HEAD^
HEAD is now at 27e7555 add distributed

2、查看readme.txt:
$ cat readme.txt
Git is a distributed version control system.
Git is free software.

3、查看版本库:
$ git log
commit 27e75555a3fd877992cc8a67aa03565d0187347d (HEAD -> master)
Author: XXX
Date: Mon Nov 18 12:38:54 2019 +0800

add distributed

commit 3a43b3eb79536e15486dba4346c2ff318d066f43
Author: XXX
Date: Mon Nov 18 12:35:58 2019 +0800

wrote a readme file

4、回到后一个版本:(没有关闭命令行窗口)
$ git reset --hard 65dde(版本号前几位)
HEAD is now at 65dde84 append GPL

5、查看readme.txt:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.

6、回到后一个版本:(关闭命令行窗口了)
$ git reflog(记录每一次命令)
65dde84 (HEAD -> master) HEAD@{0}: reset: moving to 65dde
27e7555 HEAD@{1}: reset: moving to HEAD^
65dde84 (HEAD -> master) HEAD@{2}: commit: append GPL
27e7555 HEAD@{3}: commit: add distributed
3a43b3e HEAD@{4}: commit (initial): wrote a readme file

工作区与暂存区

工作区(Working Directory):电脑里能看到的目录,如learngit。
版本库(Repository):工作区中隐藏目录.git。
暂存区(Stage or Index):位于版本库中,前面git add命令实际上是把文件修改添加到暂存区;git commit命令是提交更改,实际上是把暂存区的所有内容提交到当前分支。(在创建Git版本库时自动创建了一个master分支,所以是往master分支上提交更改。)

1、先对readme.txt文件进行修改(增加一句话):
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.

2、然后在工作区新增LICENSE文件,并执行git status命令:
$ git status
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git restore …” to discard changes in working directory)
modified: readme.txt

Untracked files:
(use “git add …” to include in what will be committed)
LICENSE

no changes added to commit (use “git add” and/or “git commit -a”)

3、用两次git add命令之后,再执行一次git status命令:
$ git status
On branch master
Changes to be committed:
(use “git restore --staged …” to unstage)
new file: LICENSE
modified: readme.txt

4、然后执行git commit命令:
$ git commit -m “understand how stage works”
[master 3605fe1] understand how stage works
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 LICENSE

管理修改

Git跟踪并管理的是修改而非文件。

1、对readme.txt进行一个修改,比如加一行:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.

2、然后提交:
$ git add readme.txt
$ git status

On branch master
Changes to be committed:
(use “git restore --staged …” to unstage)
modified: readme.txt

3、再修改:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.

4、提交:
$ git commit -m “git tracks changes”
[master 5c027e6] git tracks changes
1 file changed, 2 insertions(+), 1 deletion(-)

5、查看状态:
$ git status
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git restore …” to discard changes in working directory)
modified: readme.txt

no changes added to commit (use “git add” and/or “git commit -a”)

第二次的修改未被提交,原因是第一次修改后使用add命令加入暂存区,提交的是第一次修改后的版本,而第二次修改后没有使用add,不会被提交。

6、用git diff HEAD – readme.txt命令可以查看工作区和版本库里最新版本的区别:
$ git diff HEAD – readme.txt
diff --git a/readme.txt b/readme.txt
index db28b2c…9a8b341 100644
— a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
\ No newline at end of file
+Git tracks changes of files.
\ No newline at end of file

每次修改,如果不用git add加入暂存区,则不会加入到commit中。

撤销修改

git checkout – file命令可丢弃工作区的修改,也就是将文件在工作区的修改全部撤销。
分两种情况:
1.文件自修改后还没被放到暂存区,那么撤销修改就回到和版本库一模一样的状态;
2.文件已经添加到暂存区后,又作了修改,那么撤销修改就回到添加到暂存区后的状态。
总之是让文件回到最近一次add或commit时的状态。

1、比如在readme.txt中加一句:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Fucking!

执行git checkout – readme.txt命令,查看结果,已经删去最后一句话。

2、若已经git add,还没commit,查看一下状态:
$ git status
On branch master
Changes to be committed:
(use “git restore --staged …” to unstage)
modified: readme.txt

3、用git reset HEAD <…> 可以将暂存区的修改撤销,重新放回工作区:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当用HEAD时,表示最新版本。

4、再次查看状态:
$ git status
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git restore …” to discard changes in working directory)
modified: readme.txt

no changes added to commit (use “git add” and/or “git commit -a”)

5、丢弃工作区的修改:
$ git checkout – readme.txt
$ git status

On branch master
nothing to commit, working tree clean

若从暂存区commit到了版本库,可用版本回退的方法解决。(前提是没有推送到远程库。)

删除文件

1、先添加一个新文件,test.txt:
$ git add test.txt
$ git commit -m “add test.txt”

2、可用rm命令删除文件:
$ rm test.txt

3、查看状态:
$ git status
On branch master
Changes not staged for commit:
(use “git add/rm …” to update what will be committed)
(use “git restore …” to discard changes in working directory)
deleted: test.txt

no changes added to commit (use “git add” and/or “git commit -a”)

4、若确实要从版本库中删除文件,可用命令git rm删除,并且git commit:
$ git rm test.txt
rm ‘test.txt’
$ git commit -m “remove test.txt”
[master 2eafec3] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt

5、若是删除有误,可将误删的文件恢复到最新版本:
$ git checkout – test.txt
(从来未被添加到版本库就被删除的文件是无法恢复的。)

远程仓库

1、若用户主目录下无.ssh文件夹,则需创建SSH Key:(在Git Bash中)
$ ssh-keygen -t rsa -C “youremail@example.com”
其他均使用默认值。
之后可在.ssh目录中找到id_rsa和id_rsa.pub文件,前者为私钥,不能泄露,后者为公钥。

打开GitHub,进入Personal settings,SSH and GPG keys,点击New SSH key,填写Title,并将.pub文件的内容复制进Key文本框中,提交即可。

2、创建远程库:
在GitHub上,点击New Repository,填写name,点击创建,然后在Git Bash中运行git remote add origin git@github.com:XXXX/XXX.git命令。
添加后,远程库的名字就是origin,这是Git默认叫法。

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。使用git push -u origin master命令。之后只要本地作了提交,就可以通过git push origin master命令将本地master分支的最新修改推送至GitHub。

3、从远程库克隆:
$ git clone git@github.com:XXXX/XXX.git
Cloning into ‘XXX’…
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

4、查看结果:
$ cd XXX
$ ls

README.md

创建与合并分支

1、创建并切换到dev分支:
$ git checkout -b dev
Switched to a new branch ‘dev’

用git branch命令查看当前分支(标注*号)

修改readme.txt文件并提交

回到master分支,而readme.txt文件内容不变,因为刚才提交是在dev分支上,master分支此时的提交点未被改变

2、将dev分支的工作成果合并到master分支上:
$ git merge dev
该命令用于合并指定分支到当前分支

3、然后可以删除dev分支:
$ git branch -d dev

鼓励使用分支完成某个任务,这样过程更安全。

4、为了防止命令使用错误,可以用switch方式切换:
$ git switch -c dev
这个命令可以创建并切换到新的分支dev

5、切换到已有分支:
$ git switch master

分支命令小结:
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name 或 git switch name
创建+切换分支:git checkout -b name 或 git switch -c name
合并某分支到当前分支:git merge name
删除分支:git branch -d name

解决自动合并分支时产生的冲突:
将合并失败的文件手动编辑为想要的内容再提交
用git log --graph命令可以看到分支合并图。
不用Fast forward模式(因为这样看不出分支合并历史)合并分支的命令:
$ git merge --no-ff -m “merge with no-ff” dev(主要是–no-ff参数)
查看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit

开发一个新功能,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D name命令强行删除。

多人协作

1、查看远程库的信息:
$ git remote
$ git remote -v
(详细信息)

2、推送分支:
$ git push origin branch-name
如$ git push origin master

master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,不需要推送到远程;
feature分支是否推送,取决于是否与其他人合作开发。

3、多人协作的工作模式:
(1)首先,可以试图用git push origin branch-name推送自己的修改;
(2)如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
(3)如果合并有冲突,则解决冲突,并在本地提交;
(4)没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功。

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to branch-name origin/branch-name。

rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

创建及操作标签

可用git tag tag-name命令为当前分支创建一个标签,用git tag命令查看所有标签(按字母顺序排列)。
用git tag tag-name commit-id命令可以为某次commit创建标签。
可用git show tag-name命令查看标签具体信息。
可以创建带有说明的标签,-a指定标签名,-m指定说明文字,如:
$ git tag -a v0.1 -m “version 0.1 released” 1094adb

删除标签可用命令git tag -d tag-name
推送标签的命令:
$ git push origin v1.0
$ git push origin --tags
(推送全部尚未推送的标签)
删除远程库的标签:
先删除本地的,然后再删除远程的($ git push origin : refs/tags/tag-name)。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐