Git简介
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
github和git是两个东西,github是一个社区,git是一个服务系统,github只支持git分布式系统,所以故名成为github。
Git的基本概念
工作区:就是你在电脑里能看到的目录,编写代码的地方。
暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
Git安装
Git官方网站
点击页面中的 Download for Windows 按钮,将自动下载Git安装包。
简洁版:下载后双击安装包,然后无脑next即可。
详细版:可以参考这位大神的博客。Git 详细安装教程(详解 Git 安装过程的每一个步骤)
Git常用命令
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m “日志信息” 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
设置用户签名
第一次使用Git需要设置一个用户签名。
说明: 签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确定本次提交是谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码。
注意 :这里设置用户签名和将来登录GitHub(或其他代码托管中心)的账号没有任何关系。
用户名配置,"admin"就是需要配置的用户名
邮箱配置,"admin@123.com"就是需要配置的邮箱
git config --global user.name admin
git config --global user.email admin@123.com
初始化本地库
首先进入项目文件的目录下,然后右击,点击 Git Bash Here 即可进到界面中去。
基本语法:
首先初始化本地库的命令 git init
初始化完成后,生成一个.git的隐藏文件,可以使用 ll -a
命令查看
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo
$ git init
Initialized empty Git repository in D:/git-demo/.git/
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ ll -a
total 68
drwxr-xr-x 1 kylin 197121 0 1月 19 11:50 ./
drwxr-xr-x 1 kylin 197121 0 1月 19 11:47 ../
drwxr-xr-x 1 kylin 197121 0 1月 19 11:50 .git/
查看本地库状态
首次查看(工作区没有任何文件)
使用 git status
命令查看git的状态,返回的三行结果分别是:
- 提示你当前的本地库在那个分支里面【这里是在master里面】
- 目前还没有东西需要提交,或者是还没有提交过东西
- 没有什么东西需要提交
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
新增文件(hello.txt)
在当前目录下,创建一个hello.txt的文件
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ ll
total 1
-rw-r--r-- 1 kylin 197121 240 1月 19 12:12 hello.txt
再次查看(检测到未追踪的文件)
这次发现第三行的反馈结果变了,这说明发现未被追踪的文件,hello.txt虽然有,但只存在工作区
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
添加暂存区
使用 git add <file>...
命令将工作区的文件添加到暂存区,查看状态,发现第三行的反馈结果发生变化,这说明当前的git追踪到这个文件。
此文件已在暂存区,在暂存区的文件可以被删除,使用 git rm --cached <file>...
命令可以删除暂存区的文件,但是本地没有删除。
删除文件后的status状态就和之前是一样的,后续在添加即可
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
# 暂存区的文件是可以被删除的,这个命令就是从暂存区删除该文件,但是本地没有删除
$ git rm --cached hello.txt
rm 'hello.txt'
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." 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 "日志信息" 文件名
便可以将文件提交到本地库,返回的信息中: 14754e6 是版本号, No commits yet 没有了,说明当前已经有了自己的版本信息了, nothing to commit, working tree clean 说明提交后的文件既没有新增,也没有修改。
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git commit -m "first commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
[master (root-commit) 14754e6] first commit
1 file changed, 10 insertions(+)
create mode 100644 hello.txt
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git status
On branch master
nothing to commit, working tree clean
历史版本
查看历史版本
git reflog
可以查看当前版本库的提交历史,凡是对仓库版本进行迭代的都会出现在这个里面,包括你回滚版本都会出现在这个历史中。
git log
就是版本的详细信息,例如 14754e6e57b7b… 是 14754e6 的详细版本号
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git reflog
14754e6 (HEAD -> master) HEAD@{0}: commit (initial): first commit
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git log
commit 14754e6e57b7b689bcb28b6e365e40765435237b (HEAD -> master)
Author: “admin” <“admin@123.com”>
Date: Thu Jan 19 14:05:33 2023 +0800
first commit
回滚代码仓库
使用 git reset --hard 版本号
的命令,可以将代码回滚到之前的版本
reset 参数是重置命令
–hard 是重置代码仓库版本
有三种模式:–soft 、–mixed 以及 --hard 是三个恢复等级。
使用 --soft 就仅仅将头指针恢复,已经 add 的暂存区以及工作空间的所有东西都不变。
如果使用 --mixed ,就将头恢复掉,已经 add 的暂存区也会丢失掉,工作空间的代码什么的是不变的。
如果使用 --hard ,那么一切就全都恢复了,头变, aad 的暂存区消失,代码什么的也恢复到以前状态。
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git reflog
797beaa (HEAD -> master) HEAD@{0}: commit: third commit
547e394 HEAD@{1}: commit: second
14754e6 HEAD@{2}: commit (initial): first commit
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git reset --hard 547e394
HEAD is now at 547e394 second
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git reflog
547e394 (HEAD -> master) HEAD@{0}: reset: moving to 547e394
797beaa HEAD@{1}: commit: third commit
547e394 (HEAD -> master) HEAD@{2}: commit: second
14754e6 HEAD@{3}: commit (initial): first commit
Git分支操作
分支的简介
使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。
分支的好处
同时并行推进多个功能开发,提高开发效率。各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支的常用命令
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
查看、创建分支
使用 git branch -v
查看当前所有分支,然后使用 git branch 分支名
创建一个新的分支,这里使用 hot-fix 作为分支名,然后再查看所有分支就可以看到新创建的分支。
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git branch -v
* master 797beaa third commit
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git branch hot-fix
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git branch -v
hot-fix 797beaa third commit
* master 797beaa third commit
切换分支
使用 git checkout 分支名
可以切换分支,可以看到切换前后末尾的分支名有所变化,已经查看分支时,分支前面的 * 号也有所改变,就说明已经切换分支了。
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git branch -v
hot-fix 797beaa third commit
* master 797beaa third commit
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (hot-fix)
$ git branch -v
* hot-fix 797beaa third commit
master 797beaa third commit
合并分支
使用 git merge 分支名
命令将分支合并。注意,是将 hot-fix 合并到 master 里面的。
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git merge hot-fix
Updating 797beaa..21e3e7e
Fast-forward
hello.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
产生冲突
原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替我们决定使用哪一个,必须人为决定新代码内容。
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git merge hot-fix
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (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 <file>..." to mark resolution)
both modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
解决冲突
手动的在冲突的文件里重新编写并保存,然后再上传到暂存区,并执行提交。
注意:此时使用
git commit
命令时不能带文件名
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master|MERGING)
$ vim hello.txt
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master|MERGING)
$ git add hello.txt
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master|MERGING)
$ git commit -m "master-hot-fix" hello.txt
fatal: cannot do a partial commit during a merge.
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master|MERGING)
$ git commit -m "master-hot-fix"
[master 4105ded] master-hot-fix
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
GitHub操作
创建远程仓库
登录GitHub之后,创建一个远程库。
远程仓库操作
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
创建远程库别名
使用 git remote add 别名 远程地址
命令,给远程库创建一个别名,目的是方便我们的操作。
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git remote add git-demo https://github.com/Kylin-46/git-demo.git
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git remote -v
git-demo https://github.com/Kylin-46/git-demo.git (fetch)
git-demo https://github.com/Kylin-46/git-demo.git (push)
推送本地分支到远程仓库
使用 git push 别名 分支
将分支上传到远程仓库
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (master)
$ git push git-demo master
Enumerating objects: 21, done.
Counting objects: 100% (21/21), done.
Delta compression using up to 8 threads
Compressing objects: 100% (14/14), done.
Writing objects: 100% (21/21), 1.58 KiB | 537.00 KiB/s, done.
Total 21 (delta 7), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (7/7), done.
To https://github.com/Kylin-46/git-demo.git
* [new branch] master -> master
拉取远程仓库到本地
使用 git pull 远程库地址别名 远程分支名
将远程仓库中的代码拉取到本地
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo (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 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 657 bytes | 5.00 KiB/s, done.
From https://github.com/Kylin-46/git-demo
* branch master -> FETCH_HEAD
4105ded..3a4abea master -> git-demo/master
Updating 4105ded..3a4abea
Fast-forward
hello.txt | 1 +
1 file changed, 1 insertion(+)
克隆远程仓库到本地
使用 git clone 远程地址
将远程仓库中的代码克隆到本地
kylin@DESKTOP-1JHN2EV MINGW64 /d/git-demo/git-test (master)
$ git clone https://github.com/Kylin-46/git-demo.git
Cloning into 'git-demo'...
remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 24 (delta 8), reused 20 (delta 7), pack-reused 0
Receiving objects: 100% (24/24), done.
Resolving deltas: 100% (8/8), done.