Skip to content

lancitx/HelloGitHub

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 

Repository files navigation

目录


1. git与github

1.1 git的安装

下载:Git Download

安装:Git 详细安装教程


1.2 github的使用

注册:GitHub

创建仓库:New repository


1.3 SSH绑定

将本地与GitHub进行SSH绑定。

  1. 生成随机密钥。
ssh-keygen -t rsa -C “[email protected]

必须对应github账号注册邮箱。

  1. id_rsa.pub文件内容添加到SSH and GPG keys

  2. 配置全局用户信息。

git config --global user.name “lancit”
git config --global user.email “[email protected]

name随意,但推荐与GitHub一致;

email必须与GitHub注册邮箱相同。

  1. 测试:

2. git常用命令

command

2.1 创建版本库

2.1.1 git clone

clone远程仓库到本地指定路径:

git clone <repository-url> <local-directory>

clone仓库特定分支副本

git clone --branch branch1 <repository-url>

clone仓库特定标签副本

git clone --branch v1.0.0 <repository-url>

clone仓库特定提交副本,选项为哈希值

git clone --branch 4c4ba1d <repository-url>

clone仓库子目录副本,要使用--depth--filter选项:

git clone --depth 1 --filter=blob:none <repository-url> subdirectory

克隆repository-url仓库下 一级子目录subdirectory副本。


2.1.2 git init

初始化一个新的Git仓库:

git init <Options> <local-directory>
  • --bare:初始化一个裸 Git 仓库,即没有工作目录的仓库。裸仓库通常用作协同目的的集中仓库。
  • --template=<template_directory>:指定一个目录来初始化 Git 仓库。可以使用此选项来为仓库提供自定义模板。
  • --separate-git-dir=<git_directory>:在指定的目录中初始化仓库,但将 Git 元数据存储在单独的目录中。当工作目录在单独的文件系统上或者与他人共享仓库时,这很有用。

2.2 修改与提交

2.2.1 git status

查看工作区暂存区状态:

git status

2.2.2 git diff

查看工作区暂存区的差异:

git diff

查看分支差异:

git diff branch1 branch2

查看单个文件的差异:

git diff <file>

查看两次提交的差异(哈希值,用git log --oneline):

git diff a1b2c3d4 e5f6g7h8

生成差异补丁文件

git diff > patch.diff

忽略特定文件

git diff -- . ":(exclude)*.log"

查看合并冲突前的版本差异

git diff --base

查看合并中”我们“的版本差异

git diff --ours

查看合并中”他们“的版本差异

git diff --theirs

常用选项:

选项 作用
--cached / --staged 比较暂存区和上次提交之间的差异
--name-only 仅显示修改的文件名
--name-status 显示修改文件的状态和文件名
--stat 显示统计信息(增删行数、文件数量)
-w 忽略空白字符的差异
-U<n> 设置上下文行数

2.2.3 git add

添加单个文件:

git add <file>

添加指定目录下的变更文件:

git add <directory>

使用交互模式添加:

git add -i
  • 进入交互模式,允许选择性地暂存文件的更改。
  • 在交互模式下,可以执行以下操作:
    • status:查看当前更改。
    • update:将工作区变化更新到暂存区
    • revert撤销对暂存区的更改,并回退到上次提交版本
    • patch:逐行选择暂存内容。

分块添加文件更改

git add -p
  • 以交互模式逐块(hunk)选择文件的更改。
  • 提供选项:
    • y:暂存当前块。
    • n:跳过当前块。
    • q:退出分块添加模式。
    • s:分割当前块。
    • e:手动编辑当前块。

常用选项:

选项 功能
. 添加当前目录下的所有更改,包括新增、修改和删除的文件。
-A / --all 添加当前工作区的所有更改,包括新增、修改和删除的文件。
-u / --update 仅添加已跟踪文件的更改或删除的文件,不包括新增文件。
-p / --patch 分块模式逐块选择更改进行暂存。
-i / --interactive 进入交互模式,选择性暂存文件和更改。
--ignore-errors 忽略无法添加的文件错误,继续处理其他文件。
--dry-run 显示将被暂存的文件,但不实际添加到暂存区。
--force / -f 强制添加被 .gitignore 忽略的文件。

2.2.4 git mv

重命名文件:

git mv old_filename new_filename

移动文件到指定目录下:

git mv <file> <directory>

移动文件到指定目录下并重命名:

git mv <source> <destination>

2.2.5 git rm

删除工作区文件

git rm <file>

删除指定目录及其文件:

git rm -r <directory>

只停止追踪,但保留文件

git rm --cached config.json

常用选项

选项 功能
--cached 停止跟踪文件,但保留文件在工作区中。
-r / --recursive 递归删除目录及其内容。
-f / --force 强制删除文件,即使工作区中有未保存的修改。
-n / --dry-run 显示将被删除的文件,但不实际执行删除操作。

2.2.6 git commit

提交暂存区的更改:

git commit -m "Fixed bug"

直接提交所有更改到暂存区,并提交:

git commit -a -m "INFO"

交互式提交

git commit --interactive

逐块提交

git commit --patch

常用选项

选项 功能
-m <message> 添加提交信息。
-a 跳过 git add,自动将所有已跟踪文件的更改添加到暂存区。
--amend 修改最近一次提交(包括提交信息或内容)。
--no-edit 使用最近一次提交的消息,不编辑提交信息。
--allow-empty 提交一个空的提交(没有文件更改)。
--author="<name> <email>" 为提交指定作者。
--date=<date> 指定提交的日期。
--dry-run 显示将被提交的内容,但不实际执行提交。

2.3 撤消

HEAD指向当前分支的最新提交

特点

  1. 动态变化
    • 每次提交新的更改(git commit),HEAD 会自动移动到新的提交位置。
    • 如果切换分支(git checkout branch_name),HEAD 会指向该分支的最新提交。
  2. 当前分支指针
    • 在正常情况下,HEAD 是指向当前分支(如 mainfeature 分支)的指针。
  3. 分离状态
    • 如果 HEAD 直接指向某个特定的提交而不是分支,这种状态称为“分离 HEAD”(Detached HEAD)

2.3.1 git reset

基本语法:

git reset [options] [<commit>]
  • <commit>:指定需要重置到的目标提交。如果不提供,默认为 HEAD

  • [options]:控制重置范围(--soft--mixed--hard)。

模式 描述 暂存区 工作区
--soft 重置到指定提交,只改变 HEAD 指向,不影响暂存区和工作区的内容。 保留 保留
--mixed 重置到指定提交,改变 HEAD 和暂存区,取消暂存的更改,但保留工作区的内容。 重置 保留
--hard 重置到指定提交,改变 HEAD、暂存区和工作区,所有更改(已提交或未提交)都会被丢弃。 重置 重置

撤销文件的暂存

git reset <file>

撤销本地所有未提交的更改:

git reset --hard

撤销本地所有文件的修改,但不删除新文件

git restore <file>

重置暂存区和工作区到特定提交

git reset --hard <commit_hash>

撤销最近一次的提交,将提交更改放回暂存区,不影响工作区文件:

git reset --soft HEAD~1
  • HEAD~1:表示上一个提交。

撤销最近一次的提交,不保留提交更改到暂存区,不影响工作区文件:

git reset --mixed HEAD~1

撤销最近一次提交,同时清空暂存区和工作区的更改,恢复到上一次提交的状态:

git reset --hard HEAD~1

查看重置状态;

  • 查看HEAD指向:git log

  • 查看工作区暂存区状态:git status


2.3.2 git revert

git reset 不同,它不会直接删除提交历史,而是通过创建一个新的提交来逆转指定提交的改动

基本语法:

git revert [options] <commit>
  • <commit>:指定需要撤销的提交(通常是提交哈希 commit_hash)。

  • [options]:指定行为的附加选项(如静默模式等)。

撤销某次提交:

git revert <commit>

撤销最近一次提交:

git revert HEAD

撤销多个提交,按顺序撤销:

git revert <commit1> <commit2>

撤销一系列提交,从父提交start_commitend_commit

git revert <start_commit>^..<end_commit>

常用选项

选项 功能
-n / --no-commit 逆转提交,但不立即创建新的提交,改动保留在暂存区中。
--continue 在冲突解决后继续完成 revert 操作。
--abort 取消当前的 revert 操作。
--no-edit 不进入编辑模式,直接使用默认的提交信息。

2.3.3 git checkout

恢复文件到最近提交状态:

git checkout HEAD index.html

恢复文件到某次提交状态:

git checkout <commit_hash> <file>

查看历史提交内容,会将HEAD指向某次提交,进入分离状态

git checkout <commit_hash>

2.4 分支与标签

2.4.1 git branch

查看本地分支远程分支

git branch
git branch -r
git branch -a

创建新分支、创建新分支并切换到该分支:

git branch <branch_name>
git checkout -b <branch_name>

切换分支:

git checkout <branch_name>

删除本地分支:

git branch -d <branch_name>

删除远程分支:

git push origin --delete <branch_name>

重命名分支:

git branch -m <old_branch_name> <new_branch_name>

设置分支的上游分支:

git branch --set-upstream-to=origin/<branch_name>

查看分支的提交历史:

git log <branch_name>

创建与某个提交相关的分支:

git log <branch_name>

2.4.2 git tag

查看标签的详细信息:

git show <tag_name>

查看所有标签、查看带有详细信息的标签

git tag
git tag -n

创建轻量标签(不带元数据,即注释)的标签:

git tag <tag_name>

创建带注释的标签:

git tag -a <tag_name> -m "your message"

创建带注释的标签,并指向特定提交的标签:

git tag -a <tag_name> <commit_id> -m "your message"

删除本地标签:

git tag -d <tag_name>

删除远程标签:

git push origin --delete <tag_name>

推送标签到远程仓库、推送所有标签到远程仓库:

git push origin <tag_name>
git push --tags

2.5 合并与衍合

2.5.1 git merge

branch_name合并到当前分支,自动处理冲突:

git merge <branch_name>

合并分支时创建新的合并提交分支,保留历史提交:

git merge --no-ff <branch_name>

快速合并,不提交新的合并分支

git merge --ff <branch_name>

解决合并冲突

git add <file>
git commit

查看合并历史:

git log --graph --oneline

2.5.2 git rebase

解释:它通过将分支的基础修改为另一个分支的最新提交,使提交历史更清晰和线性。

例子:假设 feature 分支的基础是 main 的某个早期提交,变基后它的基础将更新为 main 分支的最新提交。

操作前历史:

A---B---C (main)
     \
      D---E---F (feature)

变基操作:

git checkout feature
git rebase main

变基后历史:

A---B---C (main)
             \
              D'---E'---F' (feature)

feature分支的更改为main的最新提交:

git checkout feature
git rebase main

交互式变基

git rebase -i <base_branch>

常用选项

命令 功能说明
git rebase <branch> 将当前分支变基到指定分支。
git rebase -i 交互式变基,允许修改提交的顺序或内容。
git rebase --continue 继续上一次因冲突暂停的变基操作。
git rebase --abort 取消当前变基操作,恢复到变基前的状态。
git rebase --skip 跳过当前提交并继续变基(当某个提交可以忽略时使用)。

2.6 远程操作

2.6.1 git remote

查看远程仓库、查看远程仓库的详细信息、查看仓库的配置信息:

git remote
git remote -v
git remote show <name>

添加远程仓库到本地仓库name:仓库名称,url:仓库网址:

git remote add <name> <url>

修改远程仓库的url

git remote set-url <name> <new_url>

删除远程仓库:

git remote remove <name>

2.6.2 git fetch

解释:只会下载远程仓库中的数据,更新本地的远程跟踪分支,用户需要手动进行合并。

获取远程仓库的所有更新:

git fetch

获取仓库所有的更新:

git fetch --all

获取指定仓库的更新:

git fetch <remote_name>

获取指定分支的更新:

git fetch <remote_name> <branch_name>

获取并删除本地中远程仓库已经删除的分支

git fetch --prune

获取所有远程仓库的标签:

git fetch --tags

git fetchgit pull 的区别:

  • git fetch 仅仅是获取远程仓库的更新数据,不会自动合并到当前工作分支。
  • git pullgit fetch + git merge 的组合,执行完 fetch 后,它会自动合并更新到当前分支。

2.6.3 git pull

拉取指定仓库中的特定分支更新,并合并:

git pull <remote_name> <branch_name>

拉取并进行rebase操作

git pull --rebase

拉取仅获取数据,不进行合并,该过程暂停,需要手动检阅:

git pull --no-commit

2.6.4 git push

推送指定分支到远程仓库:

git push <remote_name> <branch_name>

推送本地所有分支到远程仓库:

git push --all <remote_name>

推送标签

git push <remote_name> <tag_name>

强制推送

git push --force

此命令强制推送本地分支到远程仓库,覆盖远程仓库中的内容。注意,使用 --force 会覆盖远程分支的历史,这可能导致其他开发者的提交丢失,应该谨慎使用。常见的情况是,当你进行了 git rebase 或者修正了提交历史,且希望远程分支的历史与本地分支一致时,使用 --force 进行强制推送。

推送,并删除远程分支:

git push <remote_name> --delete <branch_name>

设置上游分支,关联本地分支到远程分支上

git push --set-upstream <remote_name> <branch_name>

3. git进阶用法


4. 日常debug总结

4.1 新建repo

echo "# test" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/lancitx/test.git
git push -u origin main

4.2 将本地repo绑定远程repo

git remote add origin https://github.com/lancitx/test.git
git branch -M main
git push -u origin main

4.3 屏蔽某文件/目录

repo根目录:

echo "myfile_or_dir/" >> .gitignore

再确保取消 Git 对该文件/目录的追踪:

git rm -r --cached myfile_or_dir/

提交更改:

git add .gitignore
git commit -m "Update .gitignore to exclude myfile_or_dir"

推送远程仓库:

git push

4.4 撤销--hard操作

当你把 git reset --soft HEAD~1 输成 git reset --hard HEAD~1 时,如果你有提交备份,则可以:

git reflog

信息输出:

5fdc6fb (HEAD -> main) HEAD@{0}: reset: moving to HEAD@{2}
5fdc6fb (HEAD -> main) HEAD@{1}: reset: moving to HEAD@{1}
b62e1cf (origin/main, origin/HEAD) HEAD@{2}: reset: moving to HEAD~1
5fdc6fb (HEAD -> main) HEAD@{3}: commit: update
b62e1cf (origin/main, origin/HEAD) HEAD@{4}: clone: from https://github.com/lancitx/FreeRTOS.git

然后,撤销到特定提交:

git reset --hard HEAD@{2}

如果有些文件尚未提交:

git fsck --lost-found

4.5 Git代理

查看Git代理:

git config --global --get http.proxy
git config --global --get https.proxy

只对 https://github.com/lancitx/FreeRTOS.git/ 仓库进行代理:

git config --global http.https://github.com.proxy socks5://127.0.0.1:7897

取消代理:

git config --global --unset http.https://github.com.proxy

对所有仓库设置代理:

git config --global http.proxy 'socks5://127.0.0.1:7897'
git config --global https.proxy 'socks5://127.0.0.1:7897'

取消代理:

git config --global --unset http.proxy
git config --global --unset https.proxy

4.6 解决LF和CRLF冲突

提交时将CRLF转为LF,但是不在检出时转换

git config --global core.autocrlf input

提交与检出时都将CRLF转为LF

git config --global core.autocrlf true

禁用自动转换功能

git config --global core.autocrlf false

查看当前Git行结束符设置:

git config --global core.autocrlf

4.7 创建页内跳转目录

可以在 markdown 文件开头键入**[TOC]**,实现自带的页内跳转,但是GitHub默认不支持该跳转

其次,可以手动创建目录,有:

标题处理 源码符号
标题由纯中文或者英文组合,不含特殊符号,直接#接标题名称。 目录,则:[Menu](#目录)Menu
若标题,包含中文符号,则忽略这些符号。 [一、引言],则:[一、引言](#一引言)
若标题为1.git与github,包含.,将其忽略或用-替代。 [1.git与github],则:[1.git与github](#1git与github)
若标题包含空格,使用-替换空格。 [1.git与github],则:[1. git与github](#1-git与github)1. git与github

最后可以使用VScode中的插件Markdown All in One,按下Ctrl + Shift + P,打开搜索命令栏,键入:

Markdown All in One: Create Table of Contents

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published