Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术,可以实现项目多人协作开发,对相关话术进行说明:
.git
,这个不算工作区,而是Git的版本库。master
,以及指向master
的一个指针叫HEAD
。首先进入软件的下载,进入git官网,根据自己的需求下载即可,本次主要针对windows进行讲解说明,下载完成后直接进行安装即可,安装时根据自己的需求选择所需的配置,安装完成后如下图所示:
安装完成后进行相关的设置:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
运行完后生成一个.gitconfig的文件,使用Notepad++打开,可以看到配置文件:
git-bash和git-cmd为我们常用的,git-bash类似于linux和unix的命令行,git-cmd类似于windows的命令行,我们本次使用git-bash,为了便于我们使用,先对常用命令行进行介绍:
选择合适的地方创建一个新目录(博主在E盘下创建了learn_git文件夹):
$ cd E:\learn_git
使用git init命令将此目录变成git可以管理的仓库:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git
$ git init
Initialized empty Git repository in E:/learn_git/.git/
完成后会在该目录下生成.git的文件夹,此文件夹可能在隐藏的,windows如何查看可以参考Windows:显示隐藏文件或文件夹,也可以使用命令,ls -ah即可看到有.git文件
在该目录下添加一个test.txt文件,内容随意写,完成后使用git add命令将文件添加到仓库:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git add test.txt
完成后没提示任何命令,则说明成功
用命令git commit
告诉Git,把文件提交到仓库:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git commit -m 'first commit'
[master (root-commit) 13ef42c] first commit
1 file changed, 12 insertions(+)
create mode 100644 test.txt
-m 后面表示内容的修改说明(此处可以写自己本次更改的大致内容,便于自己后续查找某版本)
前面我们已经了解了如何提交文件到仓库,修改也类似,先对文件进行修改,然后进行相应的添加、提交,但当我们发现出现问题想撤回到我们所需要的版本时候,可以按下述进行操作,首先学习一个新命令,git log命令可以进行查看,首先我们对test.txt文件进行两次修改:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git add test.txt
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git commit -m "delete something"
[master 6a485b2] delete something
1 file changed, 4 deletions(-)
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git add test.txt
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git commit -m "add something"
[master cc8a888] add something
1 file changed, 2 insertions(+)
上面我们对test.txt文件进行了更改,接下来使用git log命令查看:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git log
commit cc8a8889992ea4641383cc5932794a5cb2b84c33 (HEAD -> master)
Author: shanyonggang <511248513@qq.com>
Date: Mon Dec 9 13:14:16 2019 +0800
add something
commit 6a485b288f47f439ff8c7a45f2448a8976b5e9a9
Author: shanyonggang <511248513@qq.com>
Date: Mon Dec 9 13:13:43 2019 +0800
delete something
commit 13ef42cea4254967e7393d0abfb074d1c55e9412
Author: shanyonggang <511248513@qq.com>
Date: Mon Dec 9 11:44:51 2019 +0800
first commit
根据上面我们可以看到我们总共提交了三次,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git log --pretty=oneline
cc8a8889992ea4641383cc5932794a5cb2b84c33 (HEAD -> master) add something
6a485b288f47f439ff8c7a45f2448a8976b5e9a9 delete something
13ef42cea4254967e7393d0abfb074d1c55e9412 first commit
需要友情提示的是,你看到的一大串类似cc8a8889992ea...
的是commit id
(版本号)
现在我们要返回上一个版本,使用git reset --hard命令(当前一个版本时使用~1,前N个版本时使用~N)
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git reset --hard HEAD~1
HEAD is now at 6a485b2 delete something
这样我们就返回到上一个版本了,运行git log可以看到就只有两次提交了:
commit 6a485b288f47f439ff8c7a45f2448a8976b5e9a9 (HEAD -> master)
Author: shanyonggang <511248513@qq.com>
Date: Mon Dec 9 13:13:43 2019 +0800
delete something
commit 13ef42cea4254967e7393d0abfb074d1c55e9412
Author: shanyonggang <511248513@qq.com>
Date: Mon Dec 9 11:44:51 2019 +0800
first commit
当版本过多,如果根据上面我们需要返回前面的某个版本时候,需要一一的数,这样比较麻烦,因此采用命令,git reset --hard 6a485b2(这个位版本号),当我们后悔了又想回到最新的版本时候,则需要先使用git reflog命令查看最新版本的commit id:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git reflog
6a485b2 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
cc8a888 HEAD@{1}: commit: add something
6a485b2 (HEAD -> master) HEAD@{2}: commit: delete something
13ef42c HEAD@{3}: commit (initial): first commit
然后使用git reset --hard commit id:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git reset --hard cc8a888
HEAD is now at cc8a888 add something
这样我们又返回到了最新的版本。
工作区文件修改:在git add之前,当我们发现文件有问题时,可以使用git checkout -- test.txt命令进行修改撤回
暂存区文件修改:在git add之后,git commit之前,当发现文件有问题时候,用命令git reset HEAD
可以把暂存区的修改撤销掉(unstage),重新放回工作区,git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。
短暂总结:
git checkout -- file
。git reset HEAD
,就回到了场景1,第二步按场景1操作。删除文件使用git rm
首先我们需要将本地Git仓库和Github仓库连接起来:
平时我们需要将我们的代码存储至github或码云上,需要进行远程仓库的链接操作,由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
第2步:登陆GitHub,打开“Account settings”,进行“SSH Keys”设置
接下来进行远程仓库的添加:
目前,在GitHub上的这个learngit
仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
我们先使用本地仓库连接,在目录下运行:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git remote add origin git@github.com:ShanYonggang/git_learn.git
下一步,就可以把本地库的所有内容推送到远程库上:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git push -u origin master
Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts.
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 1.01 KiB | 1.01 MiB/s, done.
Total 9 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To github.com:ShanYonggang/git_learn.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
我们重新刷新github页面,即可看到本地文件已经提交到github仓库内:
首先使用如下命令创建分支:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
运行我们可以看到如下(后面的分支已经切换,由master变成dev):
我们可以使用git branch进行查看:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git branch
* dev
master
git branch会列出所有分支并在当前分支之前加*
对我们之前的test.txt进行修改,添加如下内容:
add branch
git checkout -b dev
git branch
然后使用git add、commit进行提交:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git add test.txt
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git commit -m 'add branch'
[dev d7206b0] add branch
1 file changed, 4 insertions(+), 2 deletions(-)
现在,dev
分支的工作完成,我们就可以切换回master
分支:
$ git chechout master
切换完后神奇的一幕出现了,我们会发现我们之前添加的内容不见了,接下来将分支成果合并到master主分支上:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git merge dev
Updating b63ba90..d7206b0
Fast-forward
test.txt | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
打开文件我们发现我们在dev分支上添加的内容已经存储进来,完成后使用git branch -d test.txt
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git branch -d dev
Deleted branch dev (was d7206b0).
短暂总结
git branch
git branch
git checkout
或者git switch
git checkout -b
或者git switch -c
git merge
git branch -d
bug分支
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当我们正在一个dev分支上进行修改开发时,突然领导通知要马上修复一个bug,此时我们dev分支未开发完,我们也不想提交,幸好,Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git stash
Saved working directory and index state WIP on dev: d7206b0 add branch
这样我们的dev分支上的内容就被存储起来了,接下来我们返回master分支,新建一个修改bug的分支,git checkout -m branch_bug,然后我们在该bug分支上完成修改和提交,修复完该bug后,进行删除该bug分支,然后我们需要返回我们之前的dev分支继续我们的工作,用git stash list
命令看看:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git stash list
stash@{0}: WIP on dev: d7206b0 add branch
然后我们需要对其进行恢复:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git stash apply
On branch dev
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: ad.txt
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: test.txt
其中:
git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;git stash pop
,恢复的同时把stash内容也删了;Feature分支
软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
要丢弃一个没有被合并过的分支,可以通过git branch -D
强行删除。
多人协作
要查看远程库的信息,用git remote:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git remote
origin
用git remote -v
显示更详细的信息:
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (dev)
$ git remote -v
origin git@github.com:ShanYonggang/git_learn.git (fetch)
origin git@github.com:ShanYonggang/git_learn.git (push)
推送分支:
使用git push origin master(主分支)进行推送,也可以进行其他分支的推送
shanyonggang@02CZLDZB024 MINGW64 /e/learn_git (master)
$ git push origin master
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 801 bytes | 801.00 KiB/s, done.
Total 9 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 1 local object.
To github.com:ShanYonggang/git_learn.git
cc8a888..946bd4e master -> master
git init
命令。git add
,注意,可反复多次使用,添加多个文件git commit -m
,完成提交git status
可以让我们时刻掌握仓库当前的状态git diff
可以查看修改了什么内容git reset --hard commit_id
,
使用git reset HEAD
将暂存区文件放回工作区git log命令
可以查看提交历史,以便确定要回退到哪个版本。git reflog
查看命令历史,以便确定要回到未来的哪个版本git add
到暂存区,那就不会加入到commit
中。git checkout -- file,
直接丢弃工作区的修改git remote add origin git@server-name:path/repo-name.git
;git push -u origin master
第一次推送master分支的所有内容(之后推送不需要添加-u参数);git clone git@server-name:path/repo-name.git
将github仓库的项目克隆至本地git checkout -b dev
来创建并切换到dev分支git checkout name
切换分支git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;使用命令git stash pop
,恢复的同时把stash内容也删了;git remote -v
;git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交;git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;git branch --set-upstream branch-name origin/branch-name
;git pull
,如果有冲突,要先处理冲突。git tag
用于新建一个标签,默认为HEAD
,也可以指定一个commit id;git tag -a -m "blablabla..."
可以指定标签信息;git tag
可以查看所有标签。