快速上手Git--Git原理,使用技巧,git和github联动

一、安装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命令是将fetchmerge命令放在一起执行了。从远程仓库获取最新代码合并到本地

与本地指定分支合并

$ 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行为的配置变量,这些变量存储在三个位置:

  1. /etc/gitconfig文件(安装 Git 时所选的目标位置):包含系统上每一个用户及他们仓库的通用配置。
    git config --system会读写该文件的配置变量(由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)
    D:\Git\etc在这里插入图片描述

  2. ~/.gitconfig~/.config/git/config文件:只针对当前用户。
    git config --global会读写该文件的配置变量,这会对你系统上 所有 的仓库生效。
    /c/Users/85094
    在这里插入图片描述

  3. 当前使用仓库的 Git 目录中的 config 文件(即 .git/config)。
    git config --local会读写该文件的配置变量,虽然默认情况下用的就是它。(当然,你需要进入某个 Git 仓库中才能让该选项生效。)

每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
H:\Algorithm\algorithm008-class02\.git在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38783664/article/details/110663456
今日推荐