# Git常用命令
# 参数解释
我们在查看某个命令的详细介绍是,会发现git提供了多种使用模板,初学者可能会比较困惑
E:\03_Coding\git-test>git diff -h
usage: git diff [<options>] [<commit>] [--] [<path>...]
or: git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>...]
or: git diff [<options>] [--merge-base] <commit> [<commit>...] <commit> [--] [<path>...]
or: git diff [<options>] <commit>...<commit>] [--] [<path>...]
or: git diff [<options>] <blob> <blob>]
or: git diff [<options>] --no-index [--] <path> <path>]
# <commit>
参数
<commit>
用于指定一个提交,有多种形式可以指定某个提交:
- 完整或部分提交哈希值(SHA-1)
1a2b3c4dda8dh239d89ah39adh39...
1a2b3c
- 提交日志中的引用,如
master@{1}
(master分支上的第一个提交) 或HEAD~2
。
master@{1}
- 分支名称或标签(版本号)
master
v1.0
- 分支名@(时间),查看分支在指定时间点的状态
master@(yestoday)
- HEAD:当前分支的最新提交
HEAD
- HEAD^:当前分支的最新提交的父提交,可以有多个,HEAD^^表示父提交的父提交,HEAD^2表示第二个父提交(合并提交的情况才有意义)
HEAD^
HEAD^^ 或HEAD~2
HEAD^2
- 提交的描述信息
"Fix bug"
- 分支名称~
,某个分支最新提交的第n个祖先提交
main~3
- 提交范围,查看过去5此次提交
HEAD~4..HEAD
# 配置文件
# 查看配置信息
git config --list
# core.quotepath,true(默认值),git提交时会对包含空格的路径使用引号
git config --global core.quotepath false
# 查看命令详细参数 git <command> -h
git config -h
# 创建仓库
# 创建新项目
# 初始化一个新的项目,在已存在的仓库执行也是安全的
mkdir my-project
cd my-project
git init
# 远程仓库拷贝
# 拷贝远程仓库到当前目录, 默认以远程仓库名git-test作为项目根目录
git clone git@gitee.com:huyadish/git-test.git
# 拷贝时指定存储位置 test目录
git clone git@gitee.com:huyadish/git-test.git test
# 提交与修改
# 暂存区操作
# 添加文件到暂存区
git add .
# 查看哪些文件在暂存区
git status
# 删除文件 git rm
# 从暂存区递归删除文件夹 a.txt
git rm -r --cached a.txt
# 强制从工作区和暂存区删除 a.txt
git rm -f a.txt
# 在工作区重命名文件
git mv a.txt 1.txt
# 在工作区移动文件
git mv a.txt dir/b.txt
# 提交暂存区到本地仓库
git commit -m "description"
# git diff
- 比较工作区和其他
# 查看工作区和暂存区所有文件的差异,没有差异时不会显示
git diff
# 查看工作区和暂存区差异,指定多个文件
git diff -- file1 file2
# 查看工作区和最新提交之间的差异
git diff HEAD
# 查看工作区与3a3996b版本的差异
git diff 3a3996b
- 比较暂存区和其他
# 查看暂存区与上一次提交的版本的差异
git diff --cached
# 查看暂存区与指定版本的差异
git diff --cached 8fe21bf
- 比较不同提交版本,或不同文件
# 查看不同提交版本的差异
git diff 8fe21bf c9031d2
# 查看两个提交的共同祖先和和后者的差异
git diff --merge-base 8fe21bf c9031d2
# 比较两个文件或目录的差异,即使不在git仓库
git diff --no-index file1.txt file2.txt
# git reset
# 回退若干个版本
git reset --hard HEAD^
# 回退到指定版本
git reset --hard 435255
# git tag
# 创建标签,默认添加在最新一次commit上
git tag v1.0 (commitID)
# 删除标签
git tag -d v1.0
# 提交标签对应的分支到远程仓库
git push -u origin v1.0
# 分支管理
# 创建分支
- git branch
# 创建本地分支,但不切换
git branch my-branch
# 删除本地分支
git branch -d my-branch
# 查看本地分支和远程分支
git branch -a
# 移除当前分支的远程跟踪
git branch --unset-upstream
- git checkout
# 创建并切换到分支 -b 表示切换
git checkout -b my-branch
- git switch
# 切换分支 -c 表示同时创建
git switch -c my-branch
# 合并分支
# 将branch分支合并到当前分支上
git merge branch
# 忽略其他分支的冲突
git merge --abort
# 将远程仓库的分支拉取并合并到当前分支
git merge origin/feature-branch
# 拉取远程仓库
# 拉取远程仓库所有的分支到本地,意味着更新本地仓库中的所有远程跟踪分支
git fetch origin
# 随后可以手动选择合并某个分支到当前分支
git merge origin/feature-branch
# 拉取并合并远程main到本地main
git pull origin main
# 模拟冲突
# 当前在master分支
E:\03_Coding\git-test>git branch
* master
rong
# 添加改变
E:\03_Coding\git-test>echo hello,world! >> rong.txt
# 提交到暂存区
E:\03_Coding\git-test>git add rong.txt
# 提交到本地仓库
E:\03_Coding\git-test>git commit -m "main branch change"
[master 1c9379e] main branch change
1 file changed, 1 insertion(+)
create mode 100644 rong.txt
# 切换到rong 分支
E:\03_Coding\git-test>git checkout rong
Switched to branch 'rong'
# 添加变化
E:\03_Coding\git-test>echo hello,rong >> rong.txt
# 提交到暂存区
E:\03_Coding\git-test>git add rong.txt
# 提交到本地仓库
E:\03_Coding\git-test>git commit -m "rong branch change"
[rong 98ffe56] rong branch change
1 file changed, 1 insertion(+)
create mode 100644 rong.txt
# 再次切换到主分支
E:\03_Coding\git-test>git switch master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
# 尝试将rong分支合并到主分支,显示存在冲突
E:\03_Coding\git-test>git merge rong
Auto-merging rong.txt
CONFLICT (add/add): Merge conflict in rong.txt
Automatic merge failed; fix conflicts and then commit the result.
# 打开rong.txt 显示如下, 需手动选择留下哪部分
<<<<<<< HEAD
hello,world!
=======
hello,rong
>>>>>>> rong
# 再次提交
E:\03_Coding\git-test>git add .
E:\03_Coding\git-test>git commit -m "merged master branch"
[master 2e3af3f] merged master branch
# 查看日志
# 查看历史提交记录
git log
# 查看相关日志简要信息
git reflog
# 远程操作
# 连接github
新设备访问github仓库时:
# 生成SSH KEY
ssh-keygen -t rsa -C "xxxxxxxx@qq.com"
github上添加SSH KEY
# 远程仓库操作
# 显示所有远程仓库
git remote -v
git remote add origin git@github.com:tianqixin/runoob-git-test.git
# 远程仓库别名
git remote rm
# 拉取远程分支更新到本地再与本地分支合并
git pull origin(远程仓库) main(远程分支) main(本地分支)
# 将本地master分支推送到远程origin 的master分支
# 并将远程master分支设置为本地master分支的远程跟踪
git push -u origin(远程仓库) master(本地仓库)
# 将本地分支关联到远程,远程也会创建test分支,设置之后只需 git push
git push --set-upstream origin test
# 删除远程分支
git push origin -d test
# 新仓库初始提交
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:Nightwatch1998/screen-datav-lib.git
git push -u origin main
# 问题总结
# 远程连接网络问题
ssh:connect to host github.com port 22: Connection timed out
在./ssh 文件夹创建config文件
Host github.com User YourEmail@163.com Hostname ssh.github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa Port 443
ssh -T git@github.com
- 输入yes