Git(二)

103 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

git 基本概念和常用命令

Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit pull,后面我们会详细介绍。

说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

显示配置信息

 $ git config --list                     --------- 显示配置信息

上传

上传和克隆时远程仓库地址必须使用SSH形式,因为HTTPS方式经常会出现错误

 $ git init                                ---------  用来初始化一个仓库
 $ git add *                               ---------  添加所有文件到暂存区
 $ git commit -m '初始化项目版本'            ---------  提交项目,将项目提交到版本库
 $ git remote add origin git@***/-.git     ------ 添加远程仓库地址,origin是给这个远程仓库起的名字
 $ git push -u origin master               ----------- 将本地的master推到远程的origin仓库
 ​
 ​
 在执行 git init 初始化仓库的时候,默认会创建 master 分支,注:只有当第一次提交的时候master才会被
 真正创建,这个时候执行git branch才可以看到master分支,也才可以使用git branch name 创建新的分支 
 ​
 ​
 补充:
 $ git status                              ----------- 查看仓库当前的状态,显示有变更的文件。
 ​
 ​
 如何移除远程仓库地址(只是移除本地的设置)
 $ git remote remove <name>
 ​
 ​
 只要上传过一次,本地分支和远程仓库建立了联系,之后再上传和下载直接使用简便命令 
 git push  远程仓库名字 远程分支:本地分支                              --------------- 上传
 git pull  远程仓库名字 远程分支:本地分支                              --------------- 拉下来
 ​
 -u 表示更新操作,当远程仓库对应分支没有文件时可以使用  例:git push -u origin master     
 -f 表示强制操作,当远程仓库对应分支有文件时使用       例:git push -f origin master 
 ​
 什么是冲突
 假如本地两个分支合并时,两个分支文件都有对方没有的内容,这个时候合并就会有冲突,
 但是有冲突也可以合并,只是需要我们在合并之后手动进入相应文件修改为我们想要的内容,即为解决冲突。
 ​
 假如本地分支和远程分支冲突(如上面所示冲突),这个时候我们push的时候是无法push上去的,
 这个时候我们需要先把远程仓库对应的内容拉下来,即 git pull 然后在本地手动解决冲突之后
 再push上去
 ​
 ​
 在修改完本地仓库的文件后,之后在 push 之前一定要执行 pull 把远程仓库的东西拿下来
 如果有冲突的话手动解决冲突,因为冲突只能在本地解决,不能去远程库解决冲突
 ​
 ​
 推送本地其他分支推送到远程仓库,会自动在远程仓库创建一个同名分支与其对应
 git push -u origin dev                -------------  将本地分支dev推送到远程仓库
 ​
 ​
 查看本地设置的所有远程仓库的地址
 git remote -v  
 ​
 删除远程分支(远程仓库的分支会被删除)
 git push -d origin dev    删除远程仓库origin的哪个分支(前面dev填远程仓库的哪个分支的名字)
                           注意:远程仓库有一个默认分支,这个默认分支是无法被删除的
                                一般默认分支就是创建的第一个分支,在远程仓库可以修改这个默认分支
 ​
 如果在推送本地仓库到远程仓库出现错误,可以强制推送
 更新(远程仓库没有文件的话可以使用这个)        git push -u origin master
 强制推送(远程仓库有文件的话可以使用这个)      git push -f origin master
 ​
 补充:
 在上传本地分支的时候,如果本地分支名字为master或main,上传到远程仓库的分支为main
 如果本地分支的名字是其他名字,则远程仓库如果没有这个本地分支名字的分支时,会自动创建一个与该本地分支
 同名的分支

克隆与pull

使用 git clone 从现有 Git 仓库中拷贝项目,克隆到本地,然后git add * ····· 上传到自己的github仓库

 # git clone
 ​
 $ git clone <repo>
 $ git add *
 $ git commit -m '第一代版本'
 ​
 ​
 例: 
 $ git clone git://github.com/schacon/grit.git
 ​
 # git pull 
 ​
 只要上传过一次,本地分支和远程仓库建立了联系,之后再上传和下载直接使用简便命令 
 $ git pull 
 ​
 git pull 命令用于从远程获取代码并合并本地的版本。
 git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写。
 命令格式如下:
 git pull 远程主机名 远程分支名:本地分支名
 ​
 ​
 $ git pull origin       本地的当前分支自动与对应的origin主机”追踪分支”进行合并。
 $ git pull              当前分支自动与唯一一个追踪分支进行合并。(一般本地只有一个分支的话可以使用)
 ​
 ​
 ​
 git pull origin master:brantest
 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
 ​
 git pull origin master
 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
 ​
 ​
 ​
 ​
 # clone 和 pull 的区别
 clone 是本地没有 repository 时,将远程 repository 整个下载过来。
 ​
 pull 是本地有 repository 时,将远程 repository 里新的 commit 数据(如有的话)下载过来,并且与本地代码merge。

撤销修改

 # 当修改还在工作区并没有添加到暂存区如何撤销:
 $ git restore <file>                        ----------- 丢弃对工作区的修改
 ​
 # 当修改已经添加到暂存区,如何撤销暂存区的修改重新回到工作区:
 $ git restore --staged <file>             
   
 ​
 注意:如果已经提交到了版本库,那就回退不了的了

删除文件

 一. 如果删除工作区但是还没有在版本库的文件,
 $ rm <file>
 ​
 ​
 二. 删除在版本库中的文件文件
 $ rm <file>
 ​
 1.如果确定删除:
 $ git rm <file>
 $ git commit -m ‘备注’
 2.如果想要撤销删除
 $ git restore <file>
 ​

分支管理

 $ git branch                            --------- 列出所有分支,并显示当前自己所在分支
 $ git branch (branchname)               --------- 创建分支命令
 $ git checkout (branchname)             --------- 切换分支命令
 $ git merge (branchname)                --------- 将任何分支合并到当前分支中去,并不会删除任何分支
 $ git branch -d (branchname)            --------  删除本地指定分支
 ​
 ​
 # 合并冲突时
 合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改
 合并冲突就出现了,我们需要手动去修改它。
 修改完之后我们可以用 git add 要告诉 Git 文件冲突已经解决,让后加到暂存区,提交到版本库
 $ git status -s
 UU runoob.php
 $ git add runoob.php
 $ git status -s
 M  runoob.php
 $ git commit
 [master 88afe0e] Merge branch 'change_site'
 ​
 ​
 注意:在删除本地分支时 git branch -d (branchname) 如果这个分支没有合并给其他分支,它会提示
      让你合并给其他分支,如果不想合并给其他分支,想直接删除,执行 git branch -D (branchname)
 ​
 如果仓库里面有内容,在 push 之前一定要执行 pull 把远程仓库的东西拿下来
 因为冲突只能在本地解决,不能去远程库解决冲突

回退版本

$ git reset --hard 版本号              ---------- 回退版本

查看日志

$ git log															---------- 查看历史提交记录
$ git log --oneline										---------- 查看历史记录的简洁的版本
$ git log --reverse --oneline					---------- 逆向显示所有日志
$ git reflog													---------- 查看历史所有版本
$ git blame <file>										---------- 以列表形式查看指定文件的历史修改记录

远程操作

 $ git remote                         ------------- 远程仓库操作
 $ git fetch                          ------------- 从远程获取代码库
 $ git pull                           ------------- 下载远程代码并合并
 $ git push                           ------------- 上传远程代码并合并

修改分支名称

假设分支名称为 oldName

想要修改为 newName

  1. 本地分支重命名 (还没有推送到远程)
 git branch -m oldName newName
  1. 远程分支重命名 (已经推送远程 - 假设本地分支和远程对应分支名称相同) a. 重命名远程分支对应的本地分支
 git branch -m oldName newName

b. 删除远程分支

 git push --delete origin oldName

c. 上传新命名的本地分支

 git push origin newName

d. 把修改后的本地分支与远程分支关联

 git branch --set-upstream-to origin/newName

注意:如果本地分支已经关联了远程分支,需要先解除原先的关联关系:

 git branch --unset-upstream 

在上传仓库时的一些问题

问题一

解决“ssh:connect to host github.com port 22: Connection timed out”

hosts文件路径

C:\Windows\System32\drivers\etc\hosts

添加hosts配置

140.82.112.3 github.com
140.82.114.4 gist.github.com
185.199.108.153 assets-cdn.github.com
199.232.68.133 raw.githubusercontent.com
199.232.68.133 gist.githubusercontent.com
199.232.68.133 cloud.githubusercontent.com
199.232.68.133 camo.githubusercontent.com
199.232.68.133 avatars0.githubusercontent.com
199.232.68.133 avatars1.githubusercontent.com
199.232.68.133 avatars2.githubusercontent.com
199.232.68.133 avatars3.githubusercontent.com
199.232.68.133 avatars4.githubusercontent.com
199.232.68.133 avatars5.githubusercontent.com
199.232.68.133 avatars6.githubusercontent.com
199.232.68.133 avatars7.githubusercontent.com
199.232.68.133 avatars8.githubusercontent.com

问题二

git clone出现 fatal: unable to access 'github.com/...'的解决办法

当我试图克隆别人的repo时,会发生这样的错误,当我从git:/而不是https://,克隆时,它工作得很好。

img 在开启shadowsocks的前提下,手动配置git的代理。git客户端输入如下两个命令就可以了。

git config --global http.proxy http://127.0.0.1:1080

git config --global https.proxy http://127.0.0.1:1080

http://也可以改成sockets5://,但是区别在于:socks5不支持通过pubkey免密登录github,每次提交代码只能输入用户名和密码。http可以支持免密登录。

取消代理:

git config --global --unset http.proxy 

git config --global --unset https.proxy 

问题三

git push 使用 https 方式时

报错:fatal: unable to access 'github.com/lubing2001/…': OpenSSL SSL_read: Connection was reset, errno 10054

解决:

产生原因:一般是这是因为服务器的SSL证书没有经过第三方机构的签署,所以才报错

参考网上解决办法:解除ssl验证后,再上传就OK了

git config --global http.sslVerify "false"

有时候上面这行代码不能解决问题的话,看下面

因为git在拉取或者提交项目时,中间会有git的http和https代理,但是我们本地环境本身就有SSL协议了,所以取消git的https代理即可,不行再取消http的代理。

 //取消http代理
 git config --global --unset http.proxy
 //取消https代理 
 git config --global --unset https.proxy

问题四:

报错:

fatal: Not a valid object name: 'master'.

问题主要是,master并不合法,也就是没有 git commit -m "" 提交一个文件上去,所以当你执行以下git branch,会发现没有看到本地分支列表。

解决方案

1 .在文件仓库中创建一个文件

2.git add 文件名 (将文件内容推送到本地暂存区)

3.git commit -m “说明” (将文件内容推送到本地仓库)

4.git branch -a 查看所有分支即可

如何和github建立连接

添加远程库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,命令格式如下:

 git remote add [shortname] [url]

由于本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:

使用以下命令生成 SSH Key:

 $ ssh-keygen -t rsa -C "youremail@example.com"

后面的 your_email@youremail.com 改为在 Github 上注册的邮箱,之后按照提示操作

成功的话会在 C:\Users\86152.ssh 下生成 .ssh 文件夹,进去,打开 id_rsa.pub,复制里面的 key

 $ ssh-keygen -t rsa -C "429240967@qq.com"
 Generating public/private rsa key pair.
 Enter file in which to save the key (/Users/tianqixin/.ssh/id_rsa): 
 Enter passphrase (empty for no passphrase):    # 直接回车
 Enter same passphrase again:                   # 直接回车
 Your identification has been saved in /Users/tianqixin/.ssh/id_rsa.
 Your public key has been saved in /Users/tianqixin/.ssh/id_rsa.pub.
 The key fingerprint is:
 SHA256:MDKVidPTDXIQoJwoqUmI4LBAsg5XByBlrOEzkxrwARI 429240967@qq.com
 The key's randomart image is:
 +---[RSA 3072]----+
 |E*+.+=**oo       |
 |%Oo+oo=o. .      |
 |%**.o.o.         |
 |OO.  o o         |
 |+o+     S        |
 |.                |
 |                 |
 |                 |
 |                 |
 +----[SHA256]-----+

回到 github 上,进入 Account => Settings(账户配置)。

img

左边选择 SSH and GPG keys,然后点击 New SSH key 按钮,title 设置标题,可以随便填,粘贴在你电脑上生成的 key。

img

img

添加成功后界面如下所示

img

为了验证是否成功,输入以下命令:

 $ ssh -T git@github.com
 The authenticity of host 'github.com (52.74.223.119)' can't be established.
 RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
 Are you sure you want to continue connecting (yes/no/[fingerprint])? yes                   # 输入 yes
 Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts.
 Hi tianqixin! You've successfully authenticated, but GitHub does not provide shell access. # 成功信息

以下命令说明我们已成功连上 Github。

之后登录后点击" New repository " 如下图所示:

img

之后在在Repository name 填入 runoob-git-test(远程仓库名) ,其他保持默认设置,点击"Create repository"按钮,就成功地创建了一个新的Git仓库:

img

创建成功后,显示如下信息:

img

以上信息告诉我们可以从这个仓库克隆出新的仓库,也可以把本地仓库的内容推送到GitHub仓库。

现在,我们根据 GitHub 的提示,在本地的仓库下运行命令:

 $ mkdir runoob-git-test                     # 创建测试目录
 $ cd runoob-git-test/                       # 进入测试目录
 $ echo "# 菜鸟教程 Git 测试" >> README.md     # 创建 README.md 文件并写入内容
 $ ls                                        # 查看目录下的文件
 README
 $ git init                                  # 初始化
 $ git add README.md                         # 添加文件
 $ git commit -m "添加 README.md 文件"        # 提交并备注信息
 [master (root-commit) 0205aab] 添加 README.md 文件
  1 file changed, 1 insertion(+)
  create mode 100644 README.md
 ​
 # 提交到 Github
 $ git remote add origin git@github.com:tianqixin/runoob-git-test.git
 $ git push -u origin master

以下命令请根据你在Github成功创建新仓库的地方复制,而不是根据我提供的命令,因为我们的Github用户名不一样,仓库名也不一样。

接下来我们返回 Github 创建的仓库,就可以看到文件已上传到 Github上:

img

查看当前的远程库

要查看当前配置有哪些远程仓库,可以用命令:

 git remote

实例

 $ git remote
 origin
 $ git remote -v
 origin    git@github.com:tianqixin/runoob-git-test.git (fetch)
 origin    git@github.com:tianqixin/runoob-git-test.git (push)

执行时加上 -v 参数,你还可以看到每个别名的实际链接地址。


提取远程仓库

Git 有两个命令用来提取远程仓库的更新。

1、从远程仓库下载新分支与数据:

 git fetch

该命令执行完后需要执行 git merge 远程分支到你所在的分支。

2、从远端仓库提取数据并尝试合并到当前分支:

 git merge

该命令就是在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支。

img

假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

接下来我们在 Github 上点击" README.md" 并在线修改它:

img

然后我们在本地更新修改。

 $ git fetch origin
 remote: Counting objects: 3, done.
 remote: Compressing objects: 100% (2/2), done.
 remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
 Unpacking objects: 100% (3/3), done.
 From github.com:tianqixin/runoob-git-test
    0205aab..febd8ed  master     -> origin/master

以上信息"0205aab..febd8ed master -> origin/master" 说明 master 分支已被更新,我们可以使用以下命令将更新同步到本地:

 $ git merge origin/master
 Updating 0205aab..febd8ed
 Fast-forward
  README.md | 1 +
  1 file changed, 1 insertion(+)

查看 README.md 文件内容:

 $ cat README.md 
 # 菜鸟教程 Git 测试
 ## 第一次修改内容

推送到远程仓库

推送你的新分支与数据到某个远端仓库命令:

 git push [alias] [branch]

以上命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支,实例如下。

 $ touch runoob-test.txt      # 添加文件
 $ git add runoob-test.txt 
 $ git commit -m "添加到远程"
 master 69e702d] 添加到远程
  1 file changed, 0 insertions(+), 0 deletions(-)
  create mode 100644 runoob-test.txt
 ​
 $ git push origin master    # 推送到 Github

重新回到我们的 Github 仓库,可以看到文件已经提交上来了:

img


删除远程仓库

删除远程仓库你可以使用命令:

 git remote rm [别名]

实例

 $ git remote -v
 origin    git@github.com:tianqixin/runoob-git-test.git (fetch)
 origin    git@github.com:tianqixin/runoob-git-test.git (push)
 ​
 # 添加仓库 origin2
 $ git remote add origin2 git@github.com:tianqixin/runoob-git-test.git
 ​
 $ git remote -v
 origin    git@github.com:tianqixin/runoob-git-test.git (fetch)
 origin    git@github.com:tianqixin/runoob-git-test.git (push)
 origin2    git@github.com:tianqixin/runoob-git-test.git (fetch)
 origin2    git@github.com:tianqixin/runoob-git-test.git (push)
 ​
 # 删除仓库 origin2
 $ git remote rm origin2
 $ git remote -v
 origin    git@github.com:tianqixin/runoob-git-test.git (fetch)
 origin    git@github.com:tianqixin/runoob-git-test.git (push)