基础操作

基本配置

# 初始化本地git仓库(创建新仓库)
git init

# 配置用户名
git config --global user.name "xxx"

# 配置邮件
git config --global user.email "xxx@xxx.com"

# 生成ssh-key
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 查看git config的设置
git config --list

# 全局配置文件
~/.gitconfig

版本提交

# 添加远端配置
git remote add origin git@github.com:josephstalin117/time_series_forecast.git

# 查看远端仓库地址
git remote -v

# 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]

#添加指定文件到暂存区
git add [file1] [file2] ...

# 提交暂存区到仓库区
git commit -m [message]

# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]

# 向上一个commit提交内容
git commit --amend

# 修改已经提交的commit内容(前提是没有提交到远端主分支)
git rebase -i <需要修改的前一个commid id>

# 合并最近三次提交(前提是没有提交到远端主分支)
git rebase -i HEAD~3

# 上传本地指定分支到远程仓库
git push [remote] [branch]
git push origin master

# 推送本地分支到远端仓库
git push --set-upstream origin [分支名]

暂存当前没有提交的更改,方便切换到其他分支

# 保存当前更改
git stash save
# 保存当前更改
git stash
# 推出之前stash的内容更改
git stash pop
# 推出之前stash的内容更改
git stash apply 

# 只stash没有被add的内容
git stash save --keep-index
# stash还未加入git记录的文件
git stash save --include-untracked

# 显示stash堆栈
git stash list --stat
# 显示第x次的更改
git stash show stash@{0}
# 显示最近一次stash的更改
git stash show
# 显示最近一次stash的详细更改
git stash show --patch

git stash save "stash msg"

git stash branch new_brach stash@{0}

过滤所有提交记录,删除不应该提交的问题

# 删除所有分支的.vscode文件夹
git filter-branch --tree-filter 'rm -rf .vscode'
# xxx不存在,不报错
git filter-branch --tree-filter 'rm -f xxx'
# 所有分支所有提交
git filter-branch --tree-filter 'rm -rf .vscoe' -- --all

# 只检查password.txt文件
git filter-branch --index-filter 'git rm --cached --ignore-unmatch password.txt'
git filter-branch -f --prune-empty -- --all

版本控制 <rev>~<n> goes backward n parents from rev, selecting the first parent each time. Use <rev>^<n> to select the n-th immediate parent of merge commit rev. <rev>~<n>, e.g. HEAD~, main~3.

# 撤销文件a的修改(没有被git add)
git checkout a

# 撤销文件a的修改(已经被git add, 但没有commit)
git reset HEAD a
git checkout a

# 撤销文件a的修改(已经被commit), HEAD指当前所在分支, HEAD^指当前分支的前一个merge节点
git reset HEAD^
git checkout a

# 回退到指定版本
git reset --hard [版本号]

# 回退到上一版本
git reset --hard HEAD^

# 单个文件恢复之前的版本
git reset 版本号 [filename]

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]

# 新建一个commit,用来撤销指定commit,后者的所有变化都将被前者抵消,并且应用到当前分支
git revert [commit]

# 改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]

# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...

# 从暂存区删除,但该文件会保留在工作区
git rm --cached [file]

# 显示当前分支的版本历史
git log

# 远程强制覆盖本地文件
git fetch --all
git reset --hard origin/master
git pull

分支与master冲突(避免git merge master)

# 从上游分支获取最新commit信息, 并有机的将当前分支和上游分支合并
git rebase master

修改之前某次提交的内容

# head~n 指从HEAD向前推n个commit
git rebase -i [git-hash]
git rabase -i [head~n]

回滚commit

# 版本库回退一个版本,重置Stage
git reset --hard HEAD~1

# 修改版本库,保留Stage,保留工作区
git reset --soft HEAD~1

# 创建一个commit来覆盖当前commit
git revert HEAD

# git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit

images

文件对比

#显示工作区与当前分支最新commit之间的差异
git diff HEAD [filename]

#显示工作区与比较上次的提交
git diff HEAD^ [filename]

#比较暂存区与最新本地版本库
git diff --cached [filename]

#显示暂存区和工作区的差异
git diff [file]

#查看工作目录同Git仓库指定 commit 的内容的差异
git diff [commit] [filename]

#git diff 不输出的处理
git --no-pager diff
git config --global core.pager 'less'

查看记录

#显示文件的历史修改
git log -p [filename]
git log --graph

#查看提交记录
git log [filename]

#显示提交的记录
git log —pretty=oneline [filename]

#查看某次提交中的某个文件变化
git show [版本号] [filename]

代理设置

git config --global http.proxy 'http://127.0.0.1:1080'
git config --global http.proxy 'socks5://127.0.0.1:1080'

git config --global https.proxy 'https://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

git config --global --unset http.proxy

git config --global --unset https.proxy


//对于使用git@协议的,可以配置socks5代理
//在~/.ssh/config 文件后面添加几行,没有可以新建一个
//socks5
Host github.com
User git
ProxyCommand connect -S 127.0.0.1:1080 %h %p

//http || https
Host github.com
User git
ProxyCommand connect -H 127.0.0.1:1080 %h %p

分支管理

分支管理

# 创建分支
git branch <branchname>

# 显示分支列表
git branch

# 显示全部分支
git branch -a

# 切换分支
git checkout <branchname>

# 创建分支并切换
git checkout -b [branch]

# 合并分支
## 先切换master分支
git checkout master
## 合并分支
git merge [branch]
## 取消merge
git merge --abort

# 删除分支
git branch -d [branchname]

remote远程主机管理

# 显示所有远程主机
git remote

# 删除远程主机
git remote rm <主机名>

# 添加远程主机
git remote add <主机名> <网址>

fetch取回远程主机的更新

git fetch <远程主机名>

# 取回远程主机的特定分支更新
git fetch <远程主机名> <分支名>

# 远程分支拉到本地 
git fetch origin [远程分支]

# 查看远程分支remote
git branch -r

# 本地创建分支并切换到该分支
git checkout -b [本地分支名称] origin/[远程分支]

# 拉取远程分支的内容
git pull origin [远程分支]

# 本地分支合并远程分支
git merge origin/master
git rebase origin/master

合并远程分支

# 本地创建一个和远程分支b相同的分支b
git checkout -b b origin/b

# 远程代码pull到本地
git pull origin b

# 返回分支a
git checkout a

# 合并分支a和分支b
git merge b

# 本地分支a同步到远程
git push origin a

彻底删除commit

删除最后一次提交

# 回滚上次提交
git reset --hard HEAD^

# 强制提交本地代码
git push origin master -f

删除指定commit提交(非最后一次提交)

# 查看提交记录,获取删除记录的前一次提交的commit-hash(注意是前一次提交的commit-hash)
git log

# 查看提交记录,获取删除记录的前一次提交的commit-hash(注意是前一次提交的commit-hash)
git log

# 查看commit记录,将要删除的commit记录前单词`pick`改为`drop`,保存退出
git rebase -i 35f96e1

# 解决冲突,强制推送更新到远端
git add .                   # 冲突时使用
git commit -m "new commit"  # 冲突时使用
git rebase --continue       # 冲突时使用
git push origin master -f

强制覆盖本地代码(与git远端仓库保持一致)

git fetch --all &&  git reset --hard origin/master && git pull

标签操作

对于某些提交,我们可以为它打上Tag,表示这次提交很重要, 比如为一些正式发布大版本的 commit,打上TAG,当某个版本出问题了,通过TAG可以快速找到此次提交对应的Hash值, 直接切换到此次版本的代码去查找问题,比起一个个commit找省事多了。

# 列出git中现有的所有标签
git tag

# 查看远程标签
git tag -r
# 创建标签
git tag [name]

# 删除本地标签
git tag -d [name]

# 推送标签到远程仓库
git push origin [name]

# 删除所有本地仓库中不存在的标签
git push origin --tags

# 删除远程标签
git push origin --delete tag [name]

创建带注释的标签

# 提交
git tag -a v1.4 -m ‘version 1.4′

#查看
git tag
v0.1
v1.3
v1.4

# 查看版本信息
git show v1.4