git 常用命令

1. 新建远程仓库

  • 在 github.com 上新建 repository :xxxx , 链接为:https://github.com/shenbo/xxxx.git
  • 本地新建文件夹:xxxx
    1
    2
    3
    4
    5
    6
    7
    cd ~/xxxx
    git init

    git add .
    git commit -m "first commit"
    git remote add origin https://github.com/shenbo/xxxx.git
    git push -u origin master

2. 远程仓库操作

  • 检出仓库:git clone https://github.com/shenbo/xxxx.git
  • 拉取仓库:git pull [remoteName] [localBranchName]
  • 推送仓库:git push [remoteName] [localBranchName]
  • 显示日志:git log -1 --stat # 显示最近一次commit的更改统计概述

3. 放弃本地修改,强制更新

1
2
3
4
5
git fetch --all
git reset --hard origin/master

# 删除 untracked 文件或文件夹,不含.gitignore
git clean -df

3. 暂存本地修改

1
2
3
4
5
6
7
8
9
# 暂存
git stash

# 恢复暂存
git stash list
git stash apply 0

# 删除暂存
git stash clear

4. 配置SSH

4.1 生成 ssh key

  • 打开git bash,设置用户名,并生成ssh-key
    1
    2
    3
    4
    5
    6
    7
    8
    git config --global user.name "shenbo"
    git config --global user.email "[email protected]"

    ssh-keygen -t rsa -b 4096 -C "[email protected]"

    eval $(ssh-agent -s) # start the ssh-agent in the background
    ssh-add ~/.ssh/id_rsa # add SSH private key to the ssh-agent
    ls ~/.ssh # lists the files in your .ssh directory

现在github推荐使用新的 Ed25519 加密算法
https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

1
2
3
4
5
6
7
git config --global user.name "shenbo"
git config --global user.email "[email protected]"

ssh-keygen -t ed25519 -C "[email protected]"

eval $(ssh-agent -s) # start the ssh-agent in the background
ssh-add ~/.ssh/id_ed25519 # add SSH private key to the ssh-agent

4.2 将 ssh 公钥添加到远程服务器

如果是连接远程服务器,可使用 ssh-copy-id 命令。

1
2
3
4
ssh-copy-id -i ~.ssh/id_ed25519.pub [email protected]
# 注意如果是使用 win10 的 powershell 终端,会报错" 无法将ssh-copy-id识别为....",
# 这是因为 win10 自带的 openssh 命令集不完整,
# 只需要打开git bash终端,运行以上命令就可以了

4.3 将 ssh 公钥添加 github.com

  • 复制~/.ssh/id_ed25519.pub

  • 在 github.com 个人设置页面,点击新建或添加 SSH key,将id_ed25519.pub内容复制进去。

  • 测试 git 客户端与 github 是否连接成功。

    1
    ssh -T [email protected]
  • 如果连接报错ssh: connect to host github.com port 22: Connection > refused, 打开/新建~/.ssh/config,修改内容如下,重新测试。

1
2
3
4
5
6
Host github.com
User [email protected]
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519
Port 443

5. 永久删除文件(包括历史记录)

ref: https://help.github.com/articles/remove-sensitive-data

  • 5.1 删除文件命令:

    1
    git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' --prune-empty --tag-name-filter cat -- --all
  • 5.2 删除文件夹命令:

    1
    2
    3
    git filter-branch --force --index-filter \
    'git rm --cached -r --ignore-unmatch PATH-TO-YOUR-FLODER-WITH-SENSITIVE-DATA' \
    --prune-empty --tag-name-filter cat -- --all
  • 5.3 把文件或文件夹添加到.gitignore文件里:

    1
    2
    3
    echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
    git add .gitignore
    git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"
  • 5.4 然后以强制覆盖的方式推送repo, 命令如下:

    1
    2
    git push origin master --force 
    git push origin master --force --tags
  • 5.5 清理和回收空间:

    1
    2
    3
    git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
    git reflog expire --expire=now --all
    git gc --prune=now
  • 5.6 另外,可以通过 rev-list 命令来找到仓库记录中的大文件:

    1
    git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"