git使用手册

186 阅读11分钟

工作多年,关于git有很多便捷的操作工具,但我还是习惯了去敲命令。因此,在这里记录一下自己工作过程中用到的“手册”指南。

git安装

首先,是git的安装,我自己是macOS系统。这里就简单讲一下关于macOS系统git官网的两种安装。

下载好安装包,右键打开,发现macOS提示无法打开。 image.png 解决方案:按住command,点击打开,会出现如下弹窗提示macOS无法验证。

此时,继续点击打开。即可进入正常安装流程。

git安装好之后,生成SSH Keys,并添加到GitLab中。 image.png

生成SSH Keys密钥:ssh-keygen -t rsa -C "youremail@example.com"

git使用

git push报错如下时

image.png 在终端执行如下命令

ssh-keygen -R git.tarstech.com

这是一个常见的 SSH 连接问题,通常发生在远程服务器(git.tarstech.com)重装系统或更新了 SSH 配置后,导致其“指纹”(Host Key)发生了变化,与你本地电脑记录的不一致。

由于你确认可以通过浏览器正常访问该网站,说明服务器是正常的,只是本地的“信任记录”过期了。

我已经帮你执行了修复命令: ssh-keygen -R git.tarstech.com

现在你可以重试之前的 Git 操作了。 (注意:第一次重试时,终端可能会提示 Are you sure you want to continue connecting (yes/no/[fingerprint])? ,请直接输入 yes 并回车即可)。

如何避免每次git push 的时候都要输入一次ssh密钥

要避免每次 git push 时都输入 SSH 密钥密码(passphrase),你可以将 SSH 密钥添加到 ssh-agent 中。macOS 的 Keychain(钥匙串)可以帮你记住这个密码。

请在终端中按顺序执行以下步骤:

1. 启动 ssh-agent

确保 ssh-agent 正在运行:

eval "$(ssh-agent -s)"

2. 修改 SSH 配置文件

你需要配置 SSH 以便自动将密钥存储到 Apple Keychain 中。 打开(或创建) ~/.ssh/config 文件:

open ~/.ssh/config

(如果文件不存在,可以用 touch ~/.ssh/config 创建)

在文件中添加以下内容:

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_rsa

(注意:如果你使用的是特定的密钥文件名而不是默认的 id_rsa ,请修改 IdentityFile 这一行的路径,例如 ~/.ssh/id_ed25519 )

3. 将私钥添加到 ssh-agent

运行以下命令,将私钥添加到代理中。 这一步会要求你输入最后一次密码 :

ssh-add --apple-use-keychain ~/.ssh/id_rsa

(同样,如果你的密钥文件名不是 id_rsa ,请替换为实际文件名)

4. 验证

现在尝试再次 push 代码,应该就不会再提示输入密码了。

补充说明: 如果你是在问 HTTPS 方式(每次都要输入用户名/密码),则可以使用 credential helper:git config --global credential.helper osxkeychain

git切换仓库

项目原来的git仓库是A,对应的邮箱A,现在更换成了仓库B,邮箱也是对应的B. 两个邮箱对应的SSH密钥也不同,SSH密钥的文件是id_rsa_company, 且已经在新的git上添加了SSH密钥。 那我要如何操作,才可以将本地项目与新的仓库关联上。并将代码提交上去?

  • 实现步骤:
    • 1、确保你的 ~/.ssh/config 文件中有对新仓库的配置
    vim ~/.ssh/config
    

    常用 Vim 快捷键总结

    • i - 进入插入模式(开始编辑)
    • Esc - 退出插入模式,回到普通模式
    • :w - 保存文件
    • :q - 退出
    • :wq - 保存并退出
    • :q!  - 强制退出不保存
    • 2、添加以下内容(如果没有的话):
    # 原仓库A(如果需要保留访问)
    Host github.com-A
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_rsa
    
    # 新仓库B
    Host github.com-B
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_rsa_company
    
    • 3、查看当前远程仓库信息
    # 查看当前的远程仓库
    git remote -v
    
    # 查看当前远程仓库的URL
    git remote get-url origin
    
    • 4、修改远程仓库地址
    // 方法一:直接修改remote URL(推荐)
    # 移除旧的origin
    git remote remove origin
    
    # 添加新的origin
    git remote add origin git@github.com-B:username/repo-name.git
    
    # 或者如果你的SSH config没有配置别名,直接用完整路径
    git remote add origin git@github.com:username/repo-name.git
    
    // 方法二: ### 如果不想删除,直接修改URL
    git remote set-url origin git@github.com-B:username/repo-name.git
    
    • 5、配置用户信息
    # 设置新的邮箱和用户名(针对这个仓库)
    git config user.email "new-email-B@company.com"
    git config user.name "Your New Name"
    
    # 或者设置为全局(所有仓库)
    git config --global user.email "new-email-B@company.com"
    git config --global user.name "Your New Name"
    
    # 验证配置
    git config --local --list | grep user
    
    • 6、推送代码到新仓库

修改 git 用户

git config --global user.email "youremail@example.com"

创建分支

git checkout -b dev

查看分支

// 查看本地分支
git branch

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

分支操作

// 切换分支
git checkout dev(分支名)

// 合并分支
git merge dev(分支名)

// 撤销合并操作
git merge --abort

// 删除分支
git branch -d dev(分支名)

// 强制删除分支
git branch -D dev(分支名)

提交项目到远程分支

// 提交三部曲
git add .
git commit -m '说明/备注'
git push

// 首次提交非 master 分支
git push -u origin dev
// 之后的提交 就可以直接使用
git push

// 强制推送(带 -f 表示舍弃线上文件,否则保留线上的 README文件)
git push -u origin dev -f
或
git push -f origin dev

// 更新代码
git pull

// 首次提交项目到github
git init
git remote -v
git remote add origin 项目地址 
    > 注意:如果报错 `fatal: remote origin already exists`时
    > 先执行 `git remote rm origin` 再进行添加
git pull origin master 
    > 目的:同步REDADME
然后执行`提交三部曲`

// 不是首次提交
直接执行 `三部曲`

git add . 提交报警告

warning:LF will be replaced by CRLF in ××××.××(文件名) The file will have its original line ending in your working directory.

git config --global core.autocrlf false

查看提交记录

git log

// 退出查看:直接输入字母q

回滚指定版本

git reset --hard 版本号 (8d722bb6e976f255f9c4c1bf9233c386d69ca5ed)

git暂存区使用

// 备份当前工作区的内容,代码提交到 暂存区
git stash

// 获取最近一次 stash 进去的内容,恢复到工作区
git stash pop

// 查看所有的 stash
git stash list

// 恢复制定版本的备份
git stash apply stash@{1}

// 清空git 暂存区栈
git stash clear

git项目分为 3个区域:工作区、暂存区、git仓库(本地仓库 和 远程仓库)

  • 工作区:本地编写的代码,不执行任何git命令,处于工作区。
  • 暂存区:执行git add命令时,会将工作区的文件标记为已暂存,保存在 暂存区.
  • 仓库:执行git commit命令时,会将标记为 已暂存的文件保存到本地仓库,并生成一个快照。

    1、查看文件修改

    // 在没有暂存之前(没有执行 git add 命令),查看某文件的本地修改
    git diff -- 【fileName】  // fileName 为指定文件名,不添加,则查看所有修改。
    
    // 撤销文件的本地修改
    git checkout -- [fileName]
    git checkout -- . // 撤销所有文件的本地修改
    '注意:该命令不可二次“反悔”,本地操作一旦撤销,将无法通过git返回'
    
    // 在暂存之后(执行 git add . 命令后),查看暂存区的修改
    git diff --staged [fileName]
    
    // 撤销暂存区全部修改
    git reset .
    

    2、服务器代码合并本地代码

    git stash // 暂存当前正在进行中的工作
    git pull // 拉取服务器的代码
    git stash pop // 合并暂存的代码
    

    3、代码写错分支,如何将一个分支的修改转移到另一个分支

    git add . // 所有修改提交暂存区,先不要 git commit
    
    git stash // 把暂存区的修改先存储起来
    
    git checkout dev // 切换到正确的分支
    
    git stash pop // 将存储的修改取出来
    
    // 然后就可以继续在正确的分支上进行开发。
    
    // 如果已经 commit 了
    先执行 git reset HEAD^ // 撤回到刚刚 commit 之前的状态
    

    4、修改dev分支,临时需要切换分支。修改紧急bug

    git stash // 代码提交暂存区,然后切换分支
    

git多个分支修改信息后,及时commit,但不push,然后切换到想要的分支,修改代码后commit。所有分支互不影响。

此操作,适合本地多分支开发的场景。

服务器代码覆盖本地代码

git reset --hard // 回滚到上一个版本
git pull origin master // 拉去master分支代码

git中Please enter a commit message to explain why this merge is necessary.

gitpull或者合并分支的时候有时会遇到这个界面。可以不管,直接进行如下操作:

  • 按键 esc
  • 输入:wq,然后按回车退出该界面即可

dev分支完全覆盖master分支

首先:'git reset --hard origin/master'

然后:强制推送远程

远程分支覆盖本地分支

git fetch --all

git reset --hard origin/master // master是修改为对应的分支名

git pull

从远程仓库拉取指定分支到本地

// 与远程仓库建立连接
git remote add origin xxx.git

// 查看本地是否具有 dev 分支
git branch

// 如果没有
git fetch origin dev

// 在本地创建分支dev 并切换到该分支
git checkout -b dev origin/dev

// 将远程 dev分支上的内容拉取到本地
git pull origin dev

本地分支与远程分支没有建立连接

报错错误:fatal: The current branch find has no upstream branch. To push the current branch and set the remote as upstream, use

  • 如果 远程有分支(branch_name),本地没有该分支
git checkout --track origin/branch_name
  • 如果 远程没有分支(branch_name),本地有该分支
git push --set-upstream origin 远程分支名
  • 如果 远程和本地都有分支(branch_name),但是没有建立连接
git branch --set-upstream-to=origin/远程分支名 本地分支名

拉取远程分支 next,并与本地master 分支合并

git pull origin next:master

拉取指定分支(dev)代码

git clone -b dev xxx.git(项目地址)

从一个git仓库拷贝到另一个git仓库

// 1、先从原地址 clone 一份代码到本地
git clone 原仓库地址

// 2、进入克隆下来的项目目录
cd 项目目录

// 3、以镜像推送的方式上传代码到新的仓库地址
git push --mirror 新仓库地址

git项目源查看、切换、删除

// 查看
git remote -v

// 切换
git remote set-url origin xxx.git(新项目地址)

// 删除
git remote rm xxx.git(项目源地址)

git强制commit,针对代码不能提交的情况(vue严谨模式、eslint、yarn lint,用于忽略检测)

git commit -m "提交备注" --no-verify

查看commit

// 查看commit了,但是未push到远程分支的描述/说明
git cherry -v

// 查看了commit了,但是未push到远程分支的详细信息
git log master ^origin/master

查看某个分支是从哪个分支拉出来的

git reflog --date=local | grep 分支名

解决git每次推送仓库都要输入用户名密码的解决方案

git config --global credential.helper store

git汇总操作链接