[工具] 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,这是 Git 的版本库。 - 暂存区:暂存区是
.git/index文件。

创建仓库
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 分支名

浙公网安备 33010602011771号