Git使用

发布时间 2023-11-30 14:20:09作者: icetd
title: Git使用
author: 天灯
categories: [编程, Git]
tags: [Git]
math: true
mermaid: true

typora-root-url: ..\..\My_Image

Git使用

配置

git config --global --list   #显示所有的设置
git config --global init.defaultBranch master #设置默认分支名
git config --global user.name "username" #用户名
git config --global user.email "example@gmail.com" #邮箱

修改git的编辑器

git默认的编辑器为nano,不常用,需要修改为vim,方法如下:打开. git/config文件,在core中添加editor=vim即可

基本命令

  • 将文件写入暂存区
git add file
  • 将文件推送到远程仓库
git push origin master
  • 文件提交到仓库
git commit -m ""
  • 拉取/获取 远程仓库代码
git pull origin master  #自动合并
git fetch origin master #手动合并
  • 查看当前状态
git status
git status -s

本地仓库推送

token

  • 新建的仓库
git init
git add .
git commit -m "first commit"
git remote add origin "https://<token>@github.com/<...>"
git remote set-url origin ...
git push -u origin master
  • 已有仓库
git remote add origin "https://<token>@github.com/<...>"
git push -u origin master
  • remote
git remote set-url origin ... #覆盖此链接
git remote set-url --add origin ... #追加链接
git remote set-url --delete origin ... #删除链接
git remote -v #查看所有
  • 重命名commit
git commit --amend -m ""

ssh

cd ~/.ssh
ssh-keygen -t rsa -C "example@gmail.com"
# id_rsa.pub config for git remote setting 

git 忽略文件

  • .gitignore
log/*         #忽略log下所有文件
!log/read.txt #除了read.txt
src/*.c       #忽略所有.c
  • 强制忽略命令
git update-index --assume-unchanged <files>  #强制忽略
git update-index --no-assume-unchanged <files>  #取消忽略

有时候上传远程仓库之后发现不小心把应该要忽略的文件或目录给push上去了(如.idea目录),这时候再去编辑project目录下的.gitignore文件并添加忽略已经不起作用了,因为.gitignore只对从来没有commit过的文件起作用。

这时我们可以通过git命令删除已提交的文件或目录,命令如下:

git rm --cached -r .idea

然后编辑project目录下的.gitignore文件(不同位置文件或目录的忽略编辑不同位置的.gitignore文件),比如添加忽略.idea目录,如下:

.idea

在.gitignore文件里边添加上面的内容,然后再进行commit和push,这样就删除了远程的已提交的内容,这样下次提交的时候就不会再提交上面忽略的内容了。

更新仓库

git add .
git commit -m update
git push

工作区与暂存区

Git本地有四个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)、git仓库(Remote Directory)。文件在这四个区域之间的转换关系如下:

img

git log查看

git help log  #查看帮助
git log -p -1 #显示最近一条提交 并显示内容
git log --oneline #简化显示每个版本只有一行
git log --author tiandeng0702 #按作者查找

git 撤销操作

git reset HEAD <file>  #取消暂存
git reset --soft HEAD^ #撤销commit
git checkout -- <file> #撤销修改 慎用

git 原位替换

将多次提交合并成一个commit

git commit --amend
git commit -m 'initial commit'
git add <forgotton_file>
git commit --amend

git 版本回退(git reset)

git reset --soft <HEAD_NAME> #撤销到指定版本 保留从<HEAD_NAME>上一次修改后的文件以及暂存区 
git reset --hard HEAD^       #撤销到上一个版本 保留从上一次修改后的文件以及暂存区 

git reset --hard <HEAD_NAME> #撤销到指定版本 不保留任何修改的文件
git reset --hard HEAD^       #撤销到上一个版本 不保留任何修改的文件

git reset --mixed <HEAD_NAME> #撤销到指定版本 保留从<HEAD_NAME>上一次修改后的文件,不保留暂存区
git reset --mixed HEAD^       #撤销到上一个版本 保留从上一次修改后的文件,不保留暂存区

# --hard 慎用,但是即使回退之后也有办法回溯
git reflog #查看所有历史记录,找到误操作的 <HEAD>
git reset --hard <HEAD> #恢复误操作之前的最新版本

git 差异(git diff)

git diff          #显示工作区与暂存区的差异
git diff HEAD     #显示工作区与版本库的差异
git diff --cached #显示暂存区与版本库的差异

git diff <HEAD1> <HEAD2> <file> #比较两个版本之间的某个 <file> 的差异
git diff <HEAD1> <HEAD2>  #比较两个版本之间的差异
git diff HEAD^	HEAD  #比较当前版本与上一个版本差异
git diff HEAD~	HEAD  #比较当前版本与上一个版本差异
git diff HEAD~2	HEAD  #比较当前版本与上两个版本差异
git diff HEAD~3 HEAD  #比较当前版本与上三个版本差异

git 删除文件(git rm)

#使用 rm file 只删除文件,暂存区会显示红色的delete, 需要git add file更新暂存区
git rm file #删除文件同时更新暂存区
git rm --cached file #只删除暂存区,文件保留在工作区

git 打标签

#当前提交打标签
git tag -a v1.0 -m "add v4l2_cam" #创建附注标签
git tag -a v1.1 #创建轻量标签               
git tag -l  #显示所有标签
git push origin v1.0 #推送
git tag -d <tagname> #删除标签

git push origin --delete <tagname> #一条命令删除线上和本地

#以前版本打标签
git tag -a v0.9 <HEAD> 

git 别名

git config --global alias.st status

git 分支

image-20220709141601336

git branch #查看分支
git branch <branch name> #直接创建分支
git checkout -b <branch name> #切换并创建分支
git checkout <branch name> #切换分支

git switch #此命令用于替换checkout, 因为checkout 还有恢复功能,switch 可以防止分支名和文件名冲突

git 合并分支

##合并分支,之前先处在主分支
git checkout master
git merge <branch name> #合并分支 不会显示geature,只保留单条分支记录
git merge -no-ff <branch name> #可以保存之前的分支历史,能更好查看merage历史,以及branch状态

git branch -d <branch name> #分支删除,必须在合并主线之后才可以删除
git branch -D <branch name> #分支删除,不合并到主线也能删除

git push origin --delete <branch name> #远端删除分支
git log --graph --oneline --decorate --all #图形显示分支状态

image-20231109000316462

git rebase <branch name> #另一种合并方式,不保留分支历史

分支冲突解决

假设一个文件在 master 中修改一行,它的分支 dev 也修改了同一行

  • 最开始 master 中的 代码
#include <stdio.h>

int main()
{
	printf("world\n");
	return 0;
}

  • 分支dev 修改的代码
#include <stdio.h>

int main()
{
	printf("Go to hell world\n");
	return 0;
}
  • 主分支master 修改的代码
#include <stdio.h>

int main()
{
	printf("Hello world\n");
	return 0;
}
* ecbf279 (HEAD -> master) master commit
| * 6ec5a07 (dev) dev commit
|/  
* 5dbad6e init master

开始合并

ubuntu@rtsp:~/test (master)$ git merge dev master 
Auto-merging main.c
CONFLICT (content): Merge conflict in main.c
Automatic merge failed; fix conflicts and then commit the result.

#出现了冲突
#############################################################################
git status # 使用 git status 查看冲突
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")         # 1. 修改冲突 然后 git commit
  (use "git merge --abort" to abort the merge) # 2. git merge --abort 取消合并 

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   main.c

no changes added to commit (use "git add" and/or "git commit -a")
#############################################################################
git diff # 查看具体冲突

diff --cc main.c
index 60aec82,31fae3c..0000000
--- a/main.c
+++ b/main.c
@@@ -2,6 -2,6 +2,10 @@@
  
  int main()
  {
++<<<<<<< HEAD
 +      printf("Hello world\n");
++=======
+       printf("Go to hell world\n");
++>>>>>>> dev
        return 0;
  }

##############################################################################
vim main.c #进行修改

#include <stdio.h>

int main()
{
	printf("Hello and Got to hello world\n");
	return 0;
}

git add.
git commit -m "merg dev"
*   f653c84 (HEAD -> master) merg dev
|\  
| * 6ec5a07 (dev) dev commit
* | ecbf279 master commit
|/  
* 5dbad6e init master

然后删除或者保留 dev 分支

git 回退 (git checkout)

git checkout -b <brance_name> <HEAD>

#e.g.
git chechout -b dev b4d551wad5ad8841

命令行显示git分支

function git_branch {
   branch="`git branch 2>/dev/null | grep "^\*" | sed -e "s/^\*\ //"`"
   if [ "${branch}" != "" ];then
       if [ "${branch}" = "(no branch)" ];then
           branch="(`git rev-parse --short HEAD`...)"
       fi
       echo " ($branch)"
   fi
}

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(git_branch)\[\033[00m\]\$ '
export PS1