Git学习记录

针对各个项目的gitignore文件示例

github/gitignore: A collection of useful .gitignore templates

忽略文件

文件 .gitignore 的格式规范如下:
• 所有空行或者以 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式可以以( / )开头防止递归。
• 匹配模式可以以( / )结尾指定目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号( ! )取反。

glob模式是指shell所使用的简化的正则表达式,*表示匹配零个或者多个任意字符,[abc]表示匹配任意一个字符,?表示匹配任意字符,中划线表示范围匹配,[0-9]表示匹配数字,两个**表示匹配任意中间目录,比如a/**/z可以匹配a/z,a/b/c/z,a/b/z登目录。

例子:

bash 复制代码
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

查看暂存状态

bash 复制代码
git status

移除文件

bash 复制代码
git rm filename

从暂存区删除

bash 复制代码
 git rm --cached README

重命名

bash 复制代码
git mv README.MD README
git status

相当于执行了如下三个命令:

bash 复制代码
mv README.MD README
git rm README.MD
git add README

重新提交

bash 复制代码
git commit --amend

这个命令会将暂存区中的文件提交。如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

bash 复制代码
git commit -m "initial commit"
git add forgotten_file
git commit --amend

最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。

取消暂存的文件

bash 复制代码
git reset HEAD <file>... 来取消暂存

撤消对文件的修改

bash 复制代码
git checkout -- <file>

从远程仓库中抓取与拉取

bash 复制代码
git fetch remote-name

这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。 必须注意 git fetch 命令会将 数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工 作。

远程仓库的移除与重命名

将 pb 重命名为 paul

bash 复制代码
 git remote rename pb paul

列出标签

bash 复制代码
 git tag
bash 复制代码
$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5

附注标签

bash 复制代码
git tag -a v1.4 -m 'my version 1.4'

-m 选项指定了一条将会存储在标签中的信息。如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输入信息。

轻量标签

轻量标签本质上是将提交校验和存储到一个文件中 - 没有保存任何其他信息。创建轻量标签,不需要使用 -a 、 -s 或 -m 选项,只需要提供标签名字:

bash 复制代码
 git tag v1.4-lw

后期打标签

bash 复制代码
 git tag -a v1.2 9fceb02

共享标签

默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。

bash 复制代码
 git push origin [tagname]

一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。这将会把所有不在远程仓库
服务器上的标签全部传送到那里。

bash 复制代码
 git push origin --tags

检出标签

使用 git checkout -b [branchname] [tagname] 在特定的标签上创建一个 新分支

Git 别名

bash 复制代码
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD --'

分支切换

bash 复制代码
$ git checkout testing

查看分叉历史

bash 复制代码
git log --oneline --decorate --graph --all

创建分支的同时切换分支

bash 复制代码
$ git checkout -b iss53

查看每一个分支的最后一次提交

bash 复制代码
 git branch -v

查看哪些分支已经合并到当前分支

bash 复制代码
git branch --merged

查看所有包含未合并工作的分支

bash 复制代码
git branch --no-merged

设置上游分支

bash 复制代码
git checkout localfix
git branch -u origin/serverfix

执行这条命令后,当你在 localfix 分支上运行 git pull 时,Git 会自动从 origin/serverfix 分支拉取更新。当你运行 git push 时,Git 会将 localfix 分支的更改推送到 origin/serverfix 分支。

检查上游分支

bash 复制代码
git branch -vv

创建跟踪分支

bash 复制代码
git checkout --track origin/serverfix

执行这条命令后,你将看到类似如下的输出:

bash 复制代码
Branch 'serverfix' set up to track remote branch 'serverfix' from 'origin'.
Switched to a new branch 'serverfix'

执行 git checkout --track origin/serverfix 后,Git 会在本地创建一个名为 serverfix 的分支,并将其设置为跟踪 origin/serverfix。这样,新的本地分支 serverfix 会自动与远程的 origin/serverfix 关联。

创建跟踪分支指定本地分支名称

bash 复制代码
git checkout -b sf origin/serverfix

执行这条命令后,你将看到类似如下的输出:

bash 复制代码
Switched to a new branch 'sf'
Branch 'sf' set up to track remote branch 'serverfix' from 'origin'.

表示本地分支 sf 已成功创建,其起点为 origin/serverfix,并且你现在已经切换到这个新创建的本地分支 sf

删除远程分支

bash 复制代码
git push origin --delete serverfix

删除本地分支

bash 复制代码
git branch -d serverfix

指定分支的变基操作

bash 复制代码
git rebase --onto master server client

详细解释

  • git rebase: 重新应用提交的命令,用于改变提交历史。
  • --onto master : 指定新的基础分支(即目标分支),这里是 master
  • server: 基线分支,表示从这个分支开始的更改将被重新应用。
  • client : 当前分支,表示将 client 分支上从 server 分支开始的所有更改重新应用到 master 上。

以上命令的意思是:"取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然后把它们在 master 分支上重演一遍"。

快进合并 master 分支

bash 复制代码
$ git checkout master
$ git merge client

接下来你决定将 server 分支中的修改也整合进来。使用 git rebase [basebranch] [topicbranch] 命
令可以直接将特性分支(即本例中的 server )变基到目标分支(即 master )上。这样做能省去你先切换到 server 分支,再对其执行变基命令的多个步骤。

bash 复制代码
$ git rebase master server

然后就可以快进合并主分支 master 了:

bash 复制代码
$ git checkout master
$ git merge server

至此, client 和 server 分支中的修改都已经整合到主分支里去了,你可以删除这两个分支,最终提交历史会变成图 最终的提交历史 中的样子:

bash 复制代码
$ git branch -d client
$ git branch -d server

git pull --rebase

详细解释

  • git pull: 从远程仓库拉取更改并合并到当前分支。
  • --rebase : 选项表示在拉取远程更改之后使用 rebase 而不是 merge。具体来说,它会将本地的更改(即当前分支的提交)暂时摘下,应用远程分支的更改,然后再将本地的更改重新应用到这些新拉取的更改之上。

假设你有如下的提交历史:

bash 复制代码
远程仓库: A---B---C---D (origin/master)
本地仓库: A---B---C---E---F (master)

当你运行 git pull --rebase 时,以下步骤会发生:

  1. 拉取远程更改 : Git 从远程仓库拉取提交 D

  2. 暂存本地更改 : Git 暂时将本地的提交 EF 摘下。

  3. 应用远程更改 : Git 将远程的提交 D 应用到本地仓库。

  4. 重新应用本地更改 : Git 将本地的提交 EF 重新应用到 D 之后。

最终的历史将变成:

bash 复制代码
A---B---C---D---E---F (master)

笔记转录:

git reset --soft HEAD^   # 命令的作用就是将最近的一次提交撤销,但是保留已经改动的文件
git branch -a            # 查看所有分支
git branch -r            # 查看远端分支
git stash                # 暂存当前更改
git stash pop            # 应用并删除stash
git remote -v            # 查看远程仓库地址
git remote set-url origin https://github.com/你的用户名/你的仓库名.git # 修改远程仓库地址
git stash list           # 查看stash列表
git stash clear          # 清楚stash缓存

git log --graph --decorate --oneline --all                         # 查看提交树
git log --graph --abbrev-commit --decorate --date=relative --all   # 查看提交树

如果拉取远程master分支之后,本地的未提交的代码不想再POP到dev_xxxxxx分支,而是想新建一个分支并且POP到新的分支上,如何操作,当前在dev_xxxxxx分支上
git stash
git checkout master
git pull origin master
git checkout dev_invoice_mailing
git checkout -b new_feature_branch
git stash pop

删除本地分支:
git checkout master # 切换到其他分支如master
git branch -d dev_xxxxx # 删除分支,有可能提示如下错误
error: The branch 'dev_xxxxx' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev_xxxxx'.

使用-D强制删除
git branch -D dev_xxxxx

已经将分支推送到远程仓库
git push origin --delete dev_xxxxx
或者
git push origin :dev_xxxxx

# git diff 可以使用 -w 忽略空白变更,或者使用 --color-words 来一词一词地显示变更
# 查看文件变更内容
git diff file-path
# 比较两次提交之间的差异
git diff commit-id1 commit-id2
# 查看工作目录中未暂存的变更
git diff # 命令会显示自上次提交以来,你在工作目录中对文件所做的更改,但尚未使用 git add 暂存的更改
# 查看已暂存的变更
git diff --staged
git diff --cached
# 查看两个分支的差异
git diff branch-1 branch-2
# 查看某次提交的变更
git diff <commit-id>^! # 使用 ^! 来查看某次提交相对于它的父提交的变更
# 查看暂存区域与某个提交的差异
git diff --cached <commit>
# 查看工作目录与某个提交的差异
git diff <commit>

# 删除旧文件
git rm file

本地创建一个与远程分支 dev_ffffff关联的分支

步骤 1:获取远程分支信息
首先,确保你的本地仓库是最新的,并获取所有远程分支的信息。
git fetch // 这将更新所有远程追踪分支的信息,包括 dev_ffffff。

步骤 2:创建并切换到本地分支
使用以下命令从远程分支 dev_ffffff 创建一个对应的本地分支,并切换到该分支:
git checkout -b dev_ffffff origin/dev_ffffff 

checkout -b:用于创建一个新的本地分支。
dev_ffffff:是新创建的本地分支的名称。
origin/dev_ffffff:指定要基于的远程分支。

步骤 3:验证操作
切换成功后,你可以查看当前所在的分支来确认操作是否正确:
git branch

协作开发时可能遇到的问题

上面已经讲了基于远程分支新建本地分之,但是在提交代码时,有可能别人已经有了提价的代码,
基于自己的开发分支上,先拉取别人的最新代码:
git stash  保存本地分支的修改内容
git fetch origin   获取远程仓库的更新
git merge origin/dev_fffff  合并更新到本地
有可能有冲突,解决冲突,解决冲突之后,标记冲突已解决并提交
git add <conflicted-file>
git commit -m "Merged remote dev_fffff and resolved conflicts"

偶尔会出现解决完冲突之后,有些更改会自动放到暂存区,但是这些更改并不是我想提交的代码,需手动将这些更改从暂存区中取消
使用 git status 来检查哪些文件还有冲突
可能会发现暂存区有不想提交的内容
Changes to be committed:
    (use "git restore --staged <file>..." to unstage)
    modified: conf_offline/xxxx/xxxx/xxxxxx.conf
    modified: controllers/xxxxxxxxxx.php
挑选出不想提交的文件
git restore --staged conf_offline/xxxx/xxxx/xxxxxx.conf
git restore --staged controllers/xxxxxxxxxx.php

回退到指定的提交,并保存更改
git log 查看提交的ID
git reset --mixed abc1234 暂存区内容将回到工作目录,默认行为

要整理提交记录并删除不需要的提交(49db0fa746137e2414b03),你可以使用 Git 的交互式 rebase 功能

# 检查当前分支状态
git status
# 如果有未提交的更改,则暂存
git stash
# 启动交互式 rebase
git rebase -i 0db54d8    
# 编辑 rebase 计划:
# 这个命令会打开一个文本编辑器,显示从基准提交到最新提交之间的所有提交记录。你会看到类似下面的内容:
pick 0db54d8 18558 [Task] messge1
pick 746137e 18558 [Task] messge2
pick 49db0fa 18558 [Task] messge3
pick 2414b03 18558 [Task] messge4

# 你需要将不需要的提交前面的pick改为drop,例如
pick 0db54d8 b2b-acg-18558 [Task] [RD]数电票普票升级 修改finance.sql
drop 746137e 18558 [Task] messge2
drop 49db0fa 18558 [Task] messge3
drop 2414b03 18558 [Task] messge4

# 保存并退出编辑器:
# 保存文件并退出编辑器。Git 会自动执行你所指定的操作,即删除不需要的提交。

# 解决冲突(如果有):
# 如果 rebase 过程中出现冲突,Git 会提示你解决冲突。解决冲突后,使用下面的命令继续 rebase:
git rebase --continue

# 完成 rebase:
# 一旦所有冲突都解决,rebase 过程将会完成。

# 验证提交记录:
使用git log或git log --graph --oneline --all来验证提交记录是否如你所期望的那样被整理好了。
git log --graph --oneline --all
相关推荐
IT古董35 分钟前
【机器学习】主动学习-增加标签的操作方法-流式选择性采样(Stream-based selective sampling)
人工智能·学习·机器学习
sealaugh322 小时前
aws(学习笔记第二十四课) 使用sam开发step functions
笔记·学习·aws
武昌库里写JAVA2 小时前
React方向:react中5种Dom的操作方式
java·开发语言·spring boot·学习·课程设计
linly12194 小时前
MATLAB学习笔记目录
笔记·学习·matlab
罗汉松(山水白河)4 小时前
解除WPS登录限制
windows·经验分享·笔记·学习·wps
YYHYJX4 小时前
C#学习笔记 --- 简单应用
开发语言·学习·c#
Clockwiseee4 小时前
JAVA多线程学习
java·开发语言·学习
A懿轩A5 小时前
C/C++ 数据结构与算法【排序】 常见7大排序详细解析【日常学习,考研必备】带图+详细代码
c语言·c++·学习·排序算法·排序
Nil_cxc6 小时前
机器学习周报-GNN模型学习
人工智能·学习·机器学习
隼玉6 小时前
【STM32-学习笔记-9-】SPI通信
c语言·笔记·stm32·学习