[工具] Git-基础

Git 基础

Git 简介

Git 是一个开源的分布式版本控制系统,用于高效地管理任何或小或大的项目。

在 Linux 发展的时候,代码的管理是手工合并的,效率很低,所以 Linus 开发了一套分布式的版本控制系统 Git,之后 Linux 开源代码的管理就放在了 Git 上管理,同时 GitHub 的上线也让 Git 风靡至今。

安装和配置 Git

  • 安装 Git:sudo apt install git
  • 配置 Git:设置 name 和 email,因为在每次 commit 时都会记录这些信息。
    • git config --global user.name "name"
    • git config --global user.email "123@456.com"

如果用了--global选项,那么配置文件保存在~/.gitconfig中,否则保存在当前项目的.git/config文件中,后者会覆盖前者的配置。

工作区、暂存区和版本库

Git-基础-2021-08-04-16-23-29

  • 工作区:电脑中的一个目录。
  • 版本库:工作区中有一个隐藏目录.git,这是 Git 的版本库。
  • 暂存区:暂存区是.git/index文件。

Git-基础-2021-08-04-16-25-53

创建仓库

git init

在一个目录下,使用git init命令来初始化一个仓库,此后该目录才成为一个工作区。

在执行完成git init命令后,工作区会生成一个.git目录,该目录是版本库,包含了资源的所有元数据。

git clone

如果在远程仓库中已经有现有的项目,可以使用git clone从远程仓库中拷贝项目,该命令会自动创建项目目录。例如:git clone git://github.com/zghong/test.git

git clone可以使用不同的协议,包括ssh, git, https等,其中最常用的是https。各种写法如下:

# ssh 协议
git clone git@github.com:zghong/test.git
# git 协议
git clone git://github.com/zghong/test.git
# https 协议
git clone https://github.com/zghong/test.git

一般仓库不大时,我们可以直接使用git clone,但如果在仓库历史的某次 commit 不小心提交了 1G 的文件,虽然后面把这个文件删除了,但是版本库(.git文件夹)中仍然存储着这个文件,所以如果我们仍然使用git clone,会把所有版本记录 clone 下来,这样整个仓库会非常大。如果仅仅是使用仓库,而不是管理仓库,只要把最近的一次 commit 给 clone 下来即可,实现这个功能需要用到git clone --depth=1命令,也称「浅拷贝」。

# 指定分支
git clone -b develop https://github.com/zghong/test.git
# 浅拷贝
git clone --depth 1 https://github.com/zghong/test.git

基本操作

git status 和 git log

  • git status:查看在上次提交之后是否有修改。
  • git log:查看提交日志。
  • git reflog:查看历史操作和对应的commit id

git add

git add将增删改的文件添加到暂存区。

git add READEME hello.c
git add *.c
git add *

git commit

git commit将暂存区内容提交到版本库中,并可以使用-m选项以在命令行中指定此次提交的注释。

每一次git commit就相当于创建一个还原点,并生成一个对应的 commit_id,commit_id 是一个 SHA1 计算出来的一个非常大的数字,用十六进制表示。

git commit -m 不带空格注释
git commit -m "带空格 的注释"

git diff

git diff显示文件修改的区别。

  • 对比尚未暂存的改动:git diff [-- filename1 filename2]
  • 对比已暂存的改动:git diff --cached [-- filename1 filename2]
  • 对比已暂存的与未暂存的所有改动:git diff HEAD [-- filename1 filename2]
  • 对比两个版本的不同:git diff HEAD HEAD^ [-- filename1 filename2]

git rm

当使用rm test.txt删除了仓库中的文件时,接下来有两种情况:

  • 确实要删除:git rm test.txt或者git add test.txt,并提交。
  • 误删除:git checkout -- test.txt即可恢复文件。

撤销修改

  • 当修改没有添加到暂存区时,丢弃工作区的改动:git checkout -- filename
  • 当修改已经添加到暂存区时,取消暂存:
    • 新文件:git rm --cached filename
    • 修改的文件:git reset HEAD filename
  • 当修改已经添加到暂存区并且已经创建了一个版本时:git reset --soft|--mixed|--hard <commit_id>
    • git reset --soft HEAD^:撤销最近一次 commit,不撤销 git add。
    • git reset --mixed HEAD^:默认操作,撤销最近一次 commit,撤销 git add。
    • git reset --hard HEAD^:撤销最近一次的 commit,撤销 git add,并且放弃修改。

分支管理

分支可以类似于两个平行的宇宙。主要用于去开辟一个新的分支去实现一个新的功能,这个分支并不会对其他分支产生任何影响。当功能开发完善之后,还可以将新分支的内容一次性合并到主分支上,这样既安全又不影响其他人的正常工作。

创建和合并分支

在创建仓库时会默认创建一个主分支 master,指针是HEAD。当创建一个分支 dev 时,将HEAD指针指向 dev 分支。可以指定当前工作分支在哪一个分支上,之后的修改提交就会记录在该分支下。

  • 查看分支:git branch
  • 创建分支:git branch 分支名
  • 创建并切换分支:git checkout -b 分支名
  • 切换分支:git checkout 分支名
  • 将某个分支合并到当前所在分支:git merge 分支名
  • 删除分支:git branch -d 分支名

合并冲突

合并 dev 分支到 master 分支,会出现以下三种情况:

  • master 分支没有提交,仅仅 dev 分支有提交:合并时默认采用Fast-forward,即快速合并。合并之后相当于直接在 master 分支操作一样,在使用git log --graph --pretty=oneline时看到的版本图没有分支提交部分。所以有时为了在版本图中体现出这种分支关系,我们会在合并时禁用快速合并git merge --no-ff dev -m '禁用 fast-forward 合并',这时会在 master 分支进行一次新的提交。
  • master 分支和 dev 分支都有提交,但是没有冲突:合并时会提示创建一次新提交。
  • master 分支和 dev 分支都有提交,并且提交的修改是同一个文件:发生冲突。

当合并发生了冲突时,Git 会用<<<<, ====, >>>>等符号在冲突文件中标记出不同分支修改的内容。这时我们需要先手动解决冲突(删除冲突文件中的标记符号,并修改冲突部分),然后再提交一次修改,之后才能合并。

标签管理

如之前所说,每一次 commit 就是创建一个版本,但是由于 commit 号是使用 SHA-1 生成的,不容易记住且没有意义,因此标签应运而生。

tag 就是一个让人容易记住的有意义的名字,它跟某个 commit 绑在一起,其实它就是指向某个 commit 的指针。

当发布一个版本时,我们通常先在版本库中打一个 tag,这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。

创建标签

  • git tag tag名 [commit id] -m "注释":创建一个标签,默认标签是打在最新提交的 commit 上的。例如git tag v1.0 -m "Release Edition v1.0"
  • git tag:查看所有标签。
  • git show tag名:查看标签信息。

操作标签

因为创建的标签都只存储在本地,不会自动推送到远程。如果需要同步远程仓库,需要使用单独的命令对标签进行同步。

  • 删除本地标签:git tag -d tag名
  • 删除远程标签名:
    • git tag -d tag名:先删除本地标签。
    • git push origin :refs/tags/tag名:删除远程标签名。
  • 推送标签:git push orgin tag名
  • 一次性推送所有未推送到远程的标签名:git push origin --tags

GitHub 的使用

提交 ssh 公钥

如果某台电脑需要与 GitHub 仓库进行交互就需要将这台电脑的 ssh 公钥提交到 GitHub 账号上。

  • 在本机生成 ssh 秘钥:ssh-keygen -t rsa -C "123@456.com"
  • 将用户目录下的.ssh文件夹下的id_rsa.pub公钥添加在 GitHub 设置中。
  • 验证是否添加成功:ssh -T git@github.com

克隆和上传项目

克隆项目

  • 不指定分支:git clone git@github.com:zghong/haha.git
  • 指定分支:git clone -b dev git@github.com:zghong/haha.git

上传项目

已经在本地创建了一个 Git 仓库后,想把本地项目上传到 GitHub 上,并且让这两个仓库进行远程同步,这样 GitHub 上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。

  • 在 Github 上创建一个空仓库 test。
  • git remote add origin git@github.com:zghong/test.git,将远程库与本地建立关联。
  • git push -u origin master,把本地库的所有内容推送到远程库上。

由于远程库是空的,我们第一次推送 master 分支时,加上了-u参数,Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令。

推送和拉取代码

  • 推送代码:git push origin 分支名
  • 拉取代码:git pull origin 分支名
  • 强制推送代码,忽略冲突:git push -f origin 分支名
posted @ 2021-08-04 19:42  香蕉不是芒果  阅读(134)  评论(0)    收藏  举报