# 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>用于指定一个提交,有多种形式可以指定某个提交:

  1. 完整或部分提交哈希值(SHA-1)
1a2b3c4dda8dh239d89ah39adh39...
1a2b3c
  1. 提交日志中的引用,如 master@{1}(master分支上的第一个提交) 或 HEAD~2
master@{1}
  1. 分支名称或标签(版本号)
master
v1.0
  1. 分支名@(时间),查看分支在指定时间点的状态
master@(yestoday)
  1. HEAD:当前分支的最新提交
HEAD
  1. HEAD^:当前分支的最新提交的父提交,可以有多个,HEAD^^表示父提交的父提交,HEAD^2表示第二个父提交(合并提交的情况才有意义)
HEAD^ 
HEAD^^ 或HEAD~2
HEAD^2
  1. 提交的描述信息
"Fix bug"
  1. 分支名称~,某个分支最新提交的第n个祖先提交
main~3
  1. 提交范围,查看过去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
Last Updated: 12/23/2024, 4:18:13 AM