梳理 git 知识,熟悉 git 安装,常见指令,操作等

参考廖雪峰的教程

廖雪峰 git 教程

安装

git 官网

命令

创建版本库

git init 创建仓库

git add file 添加到 git 中(放入暂存区)

git add . 一次性全部添加到暂存区

git commit -m 'commit description' 提交修改好的文件到本地

git log 打印提交日志

git log —oneline 打印提交日志的简写版

git diff --name-only HEAD~1 查看最近一次提交修改的文件

版本管理

git reset —hard HEAD^ 回滚到上一个版本(HEAD 代表当前版本,HEAD^代表上一个版本,HEAD^^代表上两个版本,依次类推)

git reflog 查看用户所有的提交记录

git reset —hard 1231234(提交id)回滚到 1231234 的提交版本

git checkout — file.txt 放弃工作区中对 file 文件的修改,不论暂存区是否有该文件的修改记录,即该命令不会放弃暂存区的修改,只放弃工作区的修改

git reset HEAD file.txt 放弃暂存区的内容(即放弃上一次 add 的内容),退回到工作区,此时的工作区并不是最新版本,而是在最新版本的基础上用户修改过的内容

关联远程仓库

git remote set-url origin xxx 直接切换远程仓库

已 github 为例,假设有两种情况:

1.本地已有 git 仓库或项目文件,想在 github 进行关联

  • 在 github 新建项目,不要勾选Initialize this repository with a README,默认创建即可
  • 关联 github,在本地仓库终端输入git remote add origin git@github.com:dwfrost/GitStudy.git
  • 推送内容到 github git push -u origin master

    2.本地是空文件,想从已有的 github 项目克隆

  • 打开 github 项目,复制 SSH
  • 在本地仓库终端输入git clone git@github.com:dwfrost/GitStudy.git
  • 如果是加入已有的项目,需要检出目标分支到本地,以便推送时本地分支和远程分支同名

git remote rm origin 删除已关联的远程仓库

git remote -v 查看关联的远程仓库

一个本地库可以同时关联 github 和码云:

git remote add github git@github.com:dwfrost/GitStudy.git

git remote add gitee git@gitee.com:dwfrost/GitStudy.git

然后分别推送

git push github dev

git push gitee dev

  • 踩坑记录 1:

遇到报错: fatal: refusing to merge unrelated histories

是因为两个仓库差异太大,git 认为不应该合并。

解决如下,添加一行参数--allow-unrelated-histories即可。

git pull origin master --allow-unrelated-histories

分支管理

git branch 查看当前所在的分支

创建

git branch dev 创建 dev 分支

切换

git checkout dev 切到 dev 分支

git checkout -b dev 创建并切换到 dev 分支

git checkout -b dev origin/dev 拉取远程 dev 分支并创建本地 dev 分支,建立映射关系

合并

git merge dev 将 dev 分支合并到当前分支

撤销有冲突的合并

git reset --merge 不论是否有冲突,都会撤销 merge 后的操作,但其他非 merge 的改动不会受影响

删除

git branch -d dev 删除 dev 分支(合并后才能删除,且当前分支不能为 dev)

git branch -D dev 没有合并时,强制删除 dev 分支

暂存

git stash 将修改内容(stash)移到贮藏区 git stash pop 还原并删除最新的暂存

git stash list 查看贮藏区的内容(stash)

恢复贮藏区有 2 种办法:

1.git stash apply恢复贮藏区,但贮藏区依旧保留修改内容(stash),如果想删除,使用git stash drop

2.git stash pop恢复贮藏区的同时删除修改内容(stash)

推送

git push origin dev 将 dev 分支推送到远程仓库(origin)的 dev 分支上

标签管理

git tag v1.0 新建标签

git tag 查看标签

git show v1.0 查看标签信息

git tag v0.9 7ff4f56 给某次提交打上标签

git tag -a v0.9 -m "version 0.9 released" 7ff4f56 -a后面是标签名,-m后面是标签说明

git tag -d v1.0删除标签

git push origin v1.0 推送标签到远程

git push origin --tags 一次性推送全部标签

git push origin :refs/tags/v1.0 删除远程标签(要先删本地)

添加 SSH

常见的远程仓库有 github,码云等,为了方便本地和远程提交代码,需要配置 SSH 加密,如下:

1.创建 SSH key。

1.1 创建前,看一下有没有 SSH。

cat ~/.ssh/id\_rsa.pub

如果返回一长串以 ssh-rsa 或 ssh-dsa 开头的字符串, 说明已存在本地公钥,你可以跳过以下 ssh-keygen 的步骤。

1.2 如果查询不到本地公钥,你可以按如下命令来生成 SSH 密钥 :

ssh-keygen -t rsa -C "<您的邮箱>"

一路回车,创建成功。

可以通过下面命令查看公钥。

cat ~/.ssh/id\_rsa.pub

2.添加公钥

id_rsa:密钥是用户保管的

id_rsa.pub:公钥是放在远程仓库,用于和密钥配对使用。

复制id_rsa.pub文件中的内容,打开 github/gitee 等代码托管网站,在账户管理选项中添加 SSH key。

使用系统剪切板复制公钥

Windows:

clip < ~/.ssh/id_rsa.pub

Mac:

pbcopy < ~/.ssh/id_rsa.pub

GNU/Linux (requires xclip):

xclip -sel clip < ~/.ssh/id_rsa.pub

3.踩坑记录

Enter passphrase for key '/Users/macbookpro/.ssh/id_rsa':
git@xxx.com: Permission denied (publickey).
fatal: Could not read from remote repository.

一般是创建秘钥的时候,误输了密码。如果不想每次都输入密码,创建时可以一路回车。解决(重新生成):

1.清除所有的 key-pair

ssh-add -D
rm -r ~/.ssh

删除在 github/gitee 等中的 public-key

2.重新生成秘钥,一路回车

3.测试:
在终端 ssh -T git@github.com

概念

工作区

工作区就是 git 能够管理到的工作区域,也就是该仓库下的所有文件,包括正在修改的和已经存在的文件。

暂存区

暂存区是 git 记录的修改状态,用户在工作区修改文件后,可以用git add file将文件修改放入暂存区。

注意,如果用户没有把修改操作放入暂存区,然后直接提交,那 git 是不会提交用户的操作的,git 只提交暂存区中的修改操作

另外,如果暂存区存在文件,是不能直接pull的。如果工作区存在修改文件,可以pull代码。

如果有冲突,则要求解决冲突。这时候一定要解决,然后提交,千万不要直接抛弃,因为 git 会认为你要做抛弃的操作。

配置

.gitignore

有些文件的变动或者信息是不需要提交的,比如node_modulesdist以及系统产生的垃圾文件等。示例如下:

.DS_Store
node_modules
/dist


# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

然而有时候,我们发现文件设置 gitigore 也不生效,那很有可能是这个文件或目录已经提交到仓库了,必须先删除该文件才行。

# 删除单个文件
git rm --cached logs/xx.log
# 删除目录
git rm --cached -r logs
# 如果提示某个文件无法忽略,可以添加-f参数强制忽略。
git rm -f --cached logs/xx.log

接下来正常提交代码就可以了,下次再改动,就不会提交到仓库了。

如何让系统记住密码(https 方式)

git config --global credential.helper store 在用户主目录下.gitconfig 文件生成下面的配置

[credential]
    helper = store

以后就不用每次都输入账号密码了

如何删除系统密码

git config --system --unset credential.helper

配置别名

git config --global alias.st status 全局配置,用st代替status

在配置别名的时候,如果指定 –system ,将会对所有的用户生效。
指定 –global 的时候,会对当前用户生效。 没有指定 –system 或者 –global 的时候,只在当前仓库生效。

去掉--global,那配置别名的文件存在于本仓库的.git/config中。

全局配置的文件在用户主目录下的隐藏文件.gitconfig中。

如果想删除别名,直接删除[alias]下对应的行即可。

本人别名如下:

[alias]
    st = status
    br = branch
    ck = checkout
    cm = commit -m
    new = checkout -b
    de = branch -d

注意:git config --global alias.new 'checkout -b'

配置用户名和邮箱

git config user.name <your name> 本工程用户名

git config user.email <your email> 本工程邮箱

git config --global user.name <your name> 全局用户名

git config --global user.email <your email> 全局邮箱

举个栗子

删除文件

  • git rm file 相当于 rm file,然后git add file
  • 是否真的删除?
  • 是,git commit -m 'delete file'
  • 否,git reset HEAD file + git checkout -- file

多人协作

  • 在本地创建和远程分支一样的分支,使用git checkout -b branch-name origin/branch-name
  • git pull抓取远程的最新代码;
  • 从本地推送分支,使用git push origin branch-name
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

提交规范

每次代码的提交是有意义的,常见的提交标记如下:

  • feat:新特性,新功能
  • fix:修改 bug
  • doc:修改文档
  • prod/build: 构建
  • chore: 没有源码相关的改动
基于 angular 规范的 commit

大白菜
36 声望3 粉丝