Git

Git 是分布式版本控制系统,每个用户端都会拥有本地仓库(.git 目录),可以在没有网络的情况下 commit、等网络恢复再 push 到服务端。

git

仓库

# 进入仓库目录、初始化空仓库
cd project && git init

# 初始化裸仓库。
# 无工作区、暂存区,只有仓库,节省空间,适用于服务端。
git init --bare

# 新建project.git目录,并将其初始化为裸仓库。
# 推荐服务端仓库文件夹以.git后缀命名。
git init --bare project.git

# 克隆仓库到本地,http方式
git clone https://git.test/username/project.git

# 克隆仓库到本地,ssh方式
git clone git@git.test:username/project.git

# 查看仓库设置
git config --list

# 设置全局git用户名
git config --global user.name "name"

# 设置全局git用户邮箱
git config --global user.email "test@test.com"`

# 强制使用ssh
git config --global url."git@github.com:".insteadOf "https://github.com/"

# 修改远程仓库地址
git remote set-url origin https://git.test/username/project2.git

# 修改远程仓库地址、以SSH方式访问
git remote set-url origin git@git.test:username/project2.git

# 修改远程仓库地址,带用户名密码、后续操作无需再输入密码
git remote set-url origin https://username:password@git.test/username/project2.git

多仓库配置 ssh

# 配置ssh,文件内容在下方
vi ~/.ssh/config

# 克隆github仓库到本地
git clone github:username/project.git

# 克隆test仓库到本地
git clone test:username/project.git

# 修改远程仓库地址,通过私钥访问Git服务
git remote set-url origin github:username/project2.git
# Github
Host github    # 简称
  HostName github.com    # 服务器地址
  User git    #ssh用户
  IdentityFile ~/.ssh/id_rsa_github    # 私钥

# My Server
Host test
 HostName 127.0.0.1
 User git
 IdentityFile ~/.ssh/id_rsa_lynnclub

分支

# 查看本地的分支
# 建议养成经常查看当前分支的习惯,以免操作错了分支、惹来麻烦。
git branch

# 查看本地分支与远程分支
git branch -a

# 检出本地分支
# 本地不此存在、远程存在,将检出远程分支到本地
git checkout feature_test

# 基于当前分支新建分支
git branch feature_test

# 新建分支并且切换到新分支
git checkout -b feature_test

# 将新分支推送到远程服务端
git push --set-upstream origin feature_test

# 修改分支的名称
git branch -m feature_test feature_rename

# 将feature_test合并到当前分支
git merge feature_test

# 取消刚刚的合并操作,如果已提交则无效
git merge --abort

# 删除本地分支
# 必须checkout到其它分支,才能删除该分支
git branch -d feature_test

# 删除远程分支
git push origin --delete feature_test
# 或者
git push origin :feature_test

文件操作

# 显示修改文件清单
git status

# 查看文件的修改差异
git diff a.php
# 查看所有文件的修改差异
git diff .

# 丢弃工作区的修改
# 支付通配符(例如 \*.php)
# 危险操作,checkout之后无法找回。建议多使用stash临时储存,这样误操作checkout之后,还可以找回
git checkout a.php

# 移动文件或目录
git mv a.php b.php

# 删除文件
git rm b.php

# 添加文件或目录到暂存区,支持通配符
git add a.php

# 提交暂存区到本地仓库
# 必须填写-m 说明
# 建议每次提交,有且仅有一个完整的功能。频繁的零星提交,不利于查看记录、或者回滚操作。
git commit -m 'test'

# 推送到本地分支对应的远程仓库分支
git push

# 查看提交记录
git log

stash

# 临时存储修改,将修改从工作区移入堆栈
# 适合保存不便于加入暂存区的修改
git stash

# 临时存储修改并备注
git stash save "test"

# 查看临时存储列表
git stash list

# 弹出临时储存内容,将修改恢复到工作区
git stash pop

# 弹出堆栈中指定的临时储存,1表示弹出第二个
git stash pop stash@{1}

tag

# 新建标签
git tag 1.0

# 新建带备注的标签
git tag -a 1.0 -m "my tag"

# 查看tag详细信息
git show 1.0

# 将tag推送到远程
git push origin 1.0

# 删除本地仓库tag
git tag -d 1.0

# 删除远程仓库tag
git push origin :refs/tags/1.0

回滚、重置、找回

# 回滚某次commit
git revert 326fc9f70d022afdd31b0072dbbae003783d77ed

# 强制重置HEAD到指定版本
# 危险操作,请谨慎
git reset 326fc9f70d022afdd31b0072dbbae003783d77ed

# 回退HEAD的位置,可用于回滚
# HEAD指向的是使用中分支的最后一次更新
# 2个^表示回退两个commit
git reset HEAD^^

# 100表示回退一百个commit
git reset HEAD~100

# 回退HEAD版本库
git reset --soft HEAD^^

# 回退HEAD版本库、暂存区,mixed为默认参数
git reset --mixed HEAD^^

# 回退HEAD版本库、暂存区、工作区
# 使用需要谨慎
git reset --hard HEAD^^

# 把暂存区文件拉回工作区
git reset HEAD -- <file>

# 改变分支的节点,不常用
git rebase master

# 记录了每一次操作,即使reset掉的commit,reflog都会有记录
git reflog

# 从数据库查找丢失数据,可恢复stash弹出后、误操作checkout丢失的数据
git fsck --lost-found
最后更新于