一、安装Git
git分布式版本控制器
windows用户需要下载Git
检查是否安装并配置好git:执行命令查看git版本
$ git --version
二、配置github
远程连接协议类型
https协议,提交远程仓库时每次都需要输入用户名,密码
ssh协议,只需要在一开始配置好公钥和私钥就可以免密登录了
为了一劳永逸,我们使用ssh协议和github通信
1.在本地生成公钥私钥
$ ssh-keygen -t rsa -C "邮箱地址"
-t = The type of the key to generate
密钥的类型
-C = comment to identify the key
用于识别这个密钥的注释,可以输入任何内容。这里输入邮箱地址仅仅是识别用的key
tips:需要输入密码时直接回车就好
2.github中设置公私钥
公钥私钥本地存储路径/c/Users/85094/.ssh)
在github中setting->SSH and GPG keys
点击New SSH key,输入公钥id_rsa.pub
文件内容
3.测试本地是否可以远程连接github
$ ssh -T [email protected]
Hi red010y! You've successfully authenticated, but GitHub does not provide shell access.
出现该提示说明可以建立连接。(github不支持shell命令访问)
三、与远程仓库通信
clone项目
在当前目录下载指定项目
85094@DESKTOP-0OSA7HO MINGW64 /e/learn_git (master)
$ git clone 项目地址
本地仓库配置
生成本地仓库
在任意文件夹下执行命令生成本地仓库
$ git init
当前目录会生成.git文件夹
(记录所有的git操作)。若想删除本地仓库,直接删除.git文件夹
配置用户信息
配置username,email:
每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改。
多人协作,需要确认各自身份所以需要配置username,email。
$ git config --global user.name "jiang"
$ git config --global user.email "[email protected]"
使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。
当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
查看用户名,邮箱:
$ git config --global --list
四、工作区,暂存区stage,版本库(仓库)
工作区
在工作区(项目文件夹) 新建,修改文件,文件状态会变为已修改状态,Untracked files
存在未被追踪的文件
85094@DESKTOP-0OSA7HO MINGW64 /e/learn_git (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello_git.txt
nothing added to commit but untracked files present (use "git add" to track)
暂存区
使用git add
命令(添加所有文件的命令git add .
)会让文件从工作区移动到暂存区(.git/index),同时文件状态会从已修改状态变为已暂存。
git restore --staged <file>
可以取消暂存
$ git add hello_git.txt
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: hello_git.txt
版本库
暂存区的内容需要使用git commit -m "注释信息"
提交到版本库(.git),文件状态变为已提交
$ git commit -m "web 1.0"
[master (root-commit) b4a1a18] web 1.0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hello_git.txt
提交后的git状态,nothing to commit
没有需要提交的内容
$ git status
On branch master
nothing to commit, working tree clean
修改工作区文件,查看状态
"git restore <file>
放弃修改(前提:git上有这个文件)
modified: hello_git.txt
有文件被修改
$ 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: hello_git.txt
no changes added to commit (use "git add" and/or "git commit -a")
git diff
查看所有修改的内容
git diff 指定文件目录
查看指定文件修改的内容
$ git diff
warning: LF will be replaced by CRLF in hello_git.txt.
The file will have its original line endings in your working directory
diff --git a/hello_git.txt b/hello_git.txt
index f09e9c3..741e9c8 100644
--- a/hello_git.txt
+++ b/hello_git.txt
@@ -1 +1 @@
-hello git
\ No newline at end of file
+hello world and git!
-
代表删除+
代表添加
git log
显示历史所有提交
git log 指定记录id -1
查看指定记录,-1表示只看一行
git log 指定记录id -1 -p
查看指定记录,-1表示只看一行,-p查看具体修改的内容
$ git log
commit 4ba9792398bfd4e106d253de2d8f609062b90ca4 (HEAD -> master)
Author: jiang <“[email protected]>
Date: Fri Dec 4 21:34:21 2020 +0800
web 2.0
commit b4a1a18ad47a2c3e977520dbe89e031d0127173e
Author: jiang <“[email protected]>
Date: Fri Dec 4 21:25:14 2020 +0800
web 1.0
技巧1:git add
追踪文件时忽略.gitignore
文件的内容(不放入暂存区)
git提供一种机制,在执行add命令后会一行一行的读项目目录中.gitignore
文件的内容,将其中的内容排除在版本控制之外
*.mp4
hi.txt
/test/test3.txt
技巧2:git checkout 文件目录
对于没有add的文件,如果我们进行了修改,想恢复到最初的样子用这个命令。与git restore <file>...
功能相同
技巧3:git reset HEAD 文件目录
取消已经执行了git add
命令的文件,让其恢复未追踪状态
。与git restore --staged <file>
功能相同。
五、本地仓库和远程仓库建立联系
为了便于管理,Git要求每个远程仓库都必须指定一个仓库名。git remote
命令就用于管理远程仓库名。
克隆远程仓库的时候,所使用的远程仓库自动被Git命名为origin。 如果想用其他的远程仓库名,需要用git clone命令的-o选项指定。
$ git clone -o jQuery https://github.com/jquery/jquery.git
$ git remote
jQuery
add,commit后,在github中创建仓库
在项目目录下执行命令git remote add
给本地仓库添加(指定)一个远程仓库
origin 远程仓库别名
85094@DESKTOP-0OSA7HO MINGW64 /h/Learn_Git (master)
$ git remote add origin [email protected]:red010y/仓库名.git
git remote rm
命令用于删除远程仓库。
$ git remote rm <主机名>
项目目录下使用命令git push
才能在github的mster分支
上生成远程仓库
$ git push -u origin master
五、分支,合并
分支出现原因:产品在不断的迭代,我们会面对某些用户的产品保持在老版本,并且老版本代码产生bug的情况。这时我们必须在老版本上进行bug的修复。
创建分支(在项目目录下)
85094@DESKTOP-0OSA7HO MINGW64 /h/Learn_Git (master)
$ git branch version1.0
删除分支
$ git branch -D version1.0
在本地仓库创建和删除分支后,需要把分支push到github,才能在远程仓库中创建和删除分支
85094@DESKTOP-0OSA7HO MINGW64 /h/Learn_Git (version1.0)
$ git push origin version1.0
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'version3.0' on GitHub by visiting:
remote: https://github.com/red010y/Learn_Git/pull/new/version3.0
remote:
To github.com:red010y/Learn_Git.git
* [new branch] version3.0 -> version3.0
$ git push origin --delete version3.0
To github.com:red010y/Learn_Git.git
- [deleted] version3.0
查看分支
*
代表当前使用哪个分支
$ git branch
* master
version1.0
查看远程分支
$ git branch -r
master
* version1.0
version2.0
查看所有分支(本地仓库,remotes代表远程仓库)
$ git branch -a
master
* version1.0
version2.0
remotes/origin/master
remotes/origin/version1.0
remotes/origin/version2.0
remotes/origin/version3.0
切换分支
在version1.0分支上进行的操作,不会影响master的代码
$ git checkout version1.0
合并分支
在version1.0的修改并提交的内容不会影响其他分支,可以在其他分支上使用merge合并
将新修改的内容合并 (先选择要合并的分支)。
merge后同样需要push到远程仓库
$ git checkout master
$ git merge version1.0
$ git push origin master
取回远程仓库修改的分支
远程仓库有修改,使用fetch
或者pull
命令将修改同步到本地版本库
fetch
取回远程仓库所有分支的修改
git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。(fetch命令同步的内容不会合并到任何分支上)
$ git fetch <远程主机名>
取回远程仓库指定分支的修改
$ git fetch origin master
所取回的更新,在本地主机上要用"远程主机名/分支名"
的形式读取。比如origin主机的master,就要用origin/master
读取。
$ git diff origin/master
diff --git a/test.txt b/test.txt
index f88656d..72d269d 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,2 @@
test_master
big
-hello local.I am remote!
取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。
$ git checkout -b newBrach origin/master
上面命令表示,在origin/master的基础上,创建一个新分支。
85094@DESKTOP-0OSA7HO MINGW64 /h/Learn_Git (newBranch)
$ git branch
master
* newBranch
version1.0
version2.0
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。
85094@DESKTOP-0OSA7HO MINGW64 /h/Learn_Git (version1.0)
$ git merge origin/master
Updating 4e6ee24..d0986be
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)
或者
$ git rebase origin/master
上面命令表示在当前分支上,合并origin/master。
pull
pull
命令是将fetch
和merge
命令放在一起执行了。从远程仓库获取最新代码合并到本地
与本地指定分支合并
$ git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin master
例子:
取回origin/next分支,再与当前分支合并。
$ git pull origin next
上面命令实质上,等同于先做git fetch,再做git merge。
$ git fetch origin
$ git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。 比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。
Git也允许手动建立追踪关系。
git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
$ git pull origin
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
当前分支自动与唯一一个追踪分支进行合并。
$ git pull
同分支拉取使用
如果合并需要采用rebase模式,可以使用–rebase选项。
即git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中)。然后把本地当前分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上。
$ git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。
$ git pull -p
等同于下面的命令
$ git fetch --prune origin
$ git fetch -p
扩展:配置命令system,global,local区别
git config
设置git行为的配置变量,这些变量存储在三个位置:
-
/etc/gitconfig
文件(安装 Git 时所选的目标位置):包含系统上每一个用户及他们仓库的通用配置。
git config --system
会读写该文件的配置变量(由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)
D:\Git\etc
-
~/.gitconfig
或~/.config/git/config
文件:只针对当前用户。
git config --global
会读写该文件的配置变量,这会对你系统上 所有 的仓库生效。
/c/Users/85094
-
当前使用仓库的 Git 目录中的 config 文件(即 .git/config)。
git config --local
会读写该文件的配置变量,虽然默认情况下用的就是它。(当然,你需要进入某个 Git 仓库中才能让该选项生效。)
每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
H:\Algorithm\algorithm008-class02\.git