Git 的使用
Dionysen

分布式版本控制系统,适合个人、中小企业使用。

Installation

sudo pacman -S git

Usage

基本配置

配置git 的用户名和邮箱:

git config --global user.name "dionysen"
git config --global user.email "solongnight@outlook.com"

新建一个仓库

Initiate git repository on the local:

git init  

or set the file path:

git init path/to/repo

A repository was created, but it is empty.
You can add some files to the repository:

git add [filename]  // e.g. "git add ."

Then you add this files to the stages and you need to commit this to the repository.

git commit -a -m "Changed some files"

-a does not commit any new files.
-m means that you should give the commit message.
Add a remote repository:

git remote add origin git@gitee.com:sential/source.git

Push the local repository to the remote repository:

git push origin master
  • 若要在一个新的设备上使用远程仓库,首先将此仓库克隆到本地:
git clone git@gitee.com:sential/source.git

# 值得注意的是gitee的仓库公钥管理方式导致必须使用ssh克隆,否则难以实现无密码修改远程仓库

# 官方提示:使用SSH公钥可以让你在你的电脑和 Gitee 通讯的时候使用安全连接(Git的Remote要使用SSH地址)

添加个人公钥

然后按照 gitee 上的提示添加个人公钥:

ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com"  
# Generating public/private ed25519 key pair...

cat ~/.ssh/id_ed25519.pub
# ssh-ed25519 AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....

ssh -T git@gitee.com

与远程仓库同步

每次编辑时要执行。

git pull origin master

# 然后开始编辑
# 完成后执行:

git add .
git commit -a -m "Changed some files"
git push origin master

或者每次编辑完成后,在另一处pull一次,那样不用每次编辑前都要再拉去一下了。
写两个脚本自动拉取和提交。

  • 当没有拉取最新版本的远程仓库同时又修改了本地仓库时,拉取会提示错误,需要选择合并或者放弃某一端,如果放弃本地仓库,执行以下命令:
git reset --hard
git pull origin master

分支切换

查看分支:

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

新建分支:

git checkout -b linux origin/linux
#完成新分支的修改后
git add .
git commit -a -m "Changed some files"
git push --set-upstream origin origin/linux

之后即可正常使用,切换分支使用命令:

git checkout main # 切换到主分支

不修改.gitignore的情况下忽略本地修改

如想忽略项目文件夹下的.vscode中的settings.json

git update-index --skip-worktree .vscode/settings.json

如果时间久了,忘了哪些文件被忽略了,那么可以通过 git ls-files -v 来查看,其结果中第一列打 S 标记的项目就是被忽略(Skip-worktree)的项目(关于符号的更多说明可以参考官方文档)。我们可以通过 grep 或是 PowerShell 中的 Select-String 来将这些项目过滤出来。

git ls-files -v | grep -E -i .vscode/settings.json

powershell:

git ls-files -v | Select-String -Pattern .vscode/settings.json

如何拉取远程分支出现冲突,可能需要恢复忽略,解决冲突:

git update-index --no-skip-worktree .vscode/settings.json

查看仓库状态

git status

差异比较

  1. 显示出branch1和branch2中差异的部分
git diff branch1 branch2 --stat
  1. 显示指定文件的详细差异
git diff branch1 branch2 具体文件路径
  1. 显示出所有有差异的文件的详细差异
git diff branch1 branch2
  1. 查看branch1分支有,而branch2中没有的log
git log branch1 ^branch2
  1. 查看branch2中比branch1中多提交了哪些内容
git log branch1..branch2

注意,列出来的是两个点后边(此处即dev)多提交的内容。

  1. 不知道谁提交的多谁提交的少,单纯想知道有是吗不一样
git log branch1...branch2
  1. 在上述情况下,在显示出没个提交是在哪个分支上
git log --lefg-right branch1...branch2

注意 commit 后面的箭头,根据我们在 –left-right branch1…branch2 的顺序,左箭头 < 表示是 branch1 的,右箭头 > 表示是branch2的。

子模块管理

添加子模块:

git submodule add <URL-to-module1> devices/module1

Git会自动为子模块创建一个独立的目录,并从远程仓库中克隆子模块的代码到这个目录中。

一般情况要在子模块中对子模块进行操作,如修改后提交和推送。

确保子模块是最新的:

git submodule update --remote

子模块处理好之后,父模块在提交和推送时会包含子模块的改动。

  • 远程删除分支后,本地可能还会保留记录,使用如下命令与远程同步
git remote prune origin
显示评论