Git

1、基础认识

初始化一个 Git仓库

使用 git init 命令。

git init

添加文件到Git仓库,分两步:

  • 第一步,使用命令 git add <file>,注意,可反复多次使用,添加多个文件;
  • 第二步,使用命令 git commit完成。git commit -m "git tracks changes" – 提交并备注信息

要随时掌握工作区的状态,使用 git status 命令。

如果 git status 告诉你有文件被修改过,用 git diff 可以查看修改内容。

示例:

git add readme.txt           // 将 `readme.txt` 添加到暂存区
git add -A                   // 添加 `所有文件` 到暂存区
git status                   // 查看暂存区
git diff HEAD -- readme.txt  // diff 对比, 该命令可以查看工作区和版本库里面最新版本的区别。
git diff HEAD -- quotes_spider.py
git commit -m "git tracks changes"       // 提交并备注信息

git clone

用命令 git clone 克隆一个本地库

git clone git@github.com:lqmeta/learngit.git

带用户名和密码的方式

git clone http://userName:password@链接
git clone http://username:password@127.0.0.1/res/res.git
git clone http://lqmeta:qwe123456@10.20.11.90:8080/root/wuzhu_h5.git

git中 本地远程库 的关联与取消:

1.在本地目录下关联远程repository :

git remote add origin git@github.com:git_username/repository_name.git
git remote add origin http://10.20.11.90:8080/root/wuzhu_h5.git

2.取消本地目录下关联的远程库:

git remote remove origin

总结

现在总结一下:

HEAD 指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令 git reset –hard commit_id 随便几个。

git reset --hard 750d64944cb23
git reset --hard HEAD^  上个版本
git reset --hard HEAD^^   上上个版本

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

git log --pretty=oneline --abbrev-commit   查看简洁消息

要重返未来,用 git reflog 查看命令历史,以便确定要回到未来的哪个版本。

暂存区是Git非常重要的概念,弄明白了暂存区,就弄明白了Git的很多操作到底干了什么。

2、搭建 Git 服务器

linux 创建一个git用户

创建一个 git 用户,用来运行 git 服务:

sudo adduser git // 创建用户 git 用户

禁用 git 用户的 shell 登录:

出于安全考虑,创建的 git 用户不允许登录 shell,这可以通过编辑 /etc/passwd 文件完成。

找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git 用户可以正常通过 ssh 使用git,但无法登录 shell, 因为我们为 git用户指定的 git-shell 每次一登录就自动退出。

初始化Git仓库:

先选定一个目录作为 Git仓库,假定是 /home/git/test.git,在 /home/git 目录下输入命令:

sudo git init --bare test.git

Git 就会创建一个裸仓库,裸仓库没有工作区。

然后,把 owner 改为 git 用户:

sudo chown -R git:git test.git

克隆远程仓库:

git clone git@server:/home/git/test.git

将本地的 git仓库 关联到 远程的 git仓库:

git remote add origin git@server:/home/git/test.git
git remote add origin git@49.234.217.26:/home/git/vscode-mytools.git

把本地项目推送到远程仓库

git push -u origin master 

从远程仓库里拉取一条本地不存在的分支时

    git checkout -b 本地分支名 origin/远程分支名
    git checkout -b dev origin/dev

git 操作记录

不再追踪某文件

忽略已经提交的文件(但是在本地有改动)

git update-index --assume-unchanged logs/\*.log

继续跟踪

git update-index --no-assume-unchanged logs/\*.log

https://git-scm.com/docs/git-update-index

git取消文件跟踪

git取消文件跟踪 \ git 取消文件跟踪 \ 文件跟踪

git取消文件跟踪,如果是对所有文件都取消跟踪的话,就是:

git rm -r --cached .   //不删除本地文件
git rm -r --f .   //删除本地文件

git 添加文件跟踪:

    git add .
    git add node_modules/vux/src/components

强制添加

    git add -f E:\1xjyc\1phone_rental\wuzhu_h5\Rental\src\components\*

清除缓存密码

    git config credential.helper 'cache –timeout=1'
    git config --global credential.helper store
    git config credential.helper 'cache --timeout=31104000' // 一年

git 删除远程仓库的某次提交

删除上一次远程仓库的提交,修改上次提交的代码,做一次更完美的commit。

    git reset commitId  // (注:不要带–-hard)到上个版本
    git stash 暂存修改
    git push --force   // 强制push,远程的最新的一次commit被删除
    git stash pop      // 释放暂存的修改,开始修改代码
    git add . -> git commit -m "massage" -> git push

删除之前的提交(即丢弃不要了)

    git reset --hard commitId    // 回滚代码
    git push --force             // 强制push -- 将之前的提交删除

删除本地 及 远程分支

    git branch -D XXXXXX
    git branch -r -D origin/XXXXXX

git 回滚到指定版本并推送到远程分支

– 本地分支回滚到指定版本

    git reset --hard <commit ID号>

– 强制推送到远程分支

    git push -f origin <branch name>

git 撤销本地commit

    git reset HEAD~

这样撤销了上面的commit。

git 回退

回退到指定 commit_id , 本地保留之前版本的修改

git reset --soft <commit_id>

回退到某个版本,只回退了commit的信息,不会恢复到index file一级。

如果还要提交,直接commit即可

回退到指定 commit_id , 本地不保留之前版本的修改

git reset --hard <commit_id>

彻底回退到某个版本,本地的源码也会变为上一个版本的内容。

注意会掉失本地已修改的源码。

git 查看某个文件的修改历史

然后使用下面的命令可列出文件的所有改动历史,注意,这里着眼于具体的一个文件,而不是git库,如果是库,那改动可多了去了

    git log 文件名
git log --pretty=oneline 文件名

git show 查看修改的 diff

git show 356f6def9d3fb7f3b9032ff5aa4b9110d4cca87e

git 查看某人在整个项目中的提交记录

git log --author=xxx

先查看某行代码由谁写的,在哪个commit中提交的:

git blame file_name

git将单个文件恢复到历史版本的正确方法如下:

  • git reset commit_id 文件路径
  • git checkout – 文件路径

git分支管理

  • 查看分支:git branch
  • 创建分支:git branch
  • 切换分支:git checkout
  • 创建+切换分支:git checkout -b
  • 合并某分支到当前分支:git merge
  • 删除分支:git branch -d
  • 在本地检出远程分支:git checkout -b 本地分支名 origin/远程分支名(git checkout -b dev remotes/origin/dev)

首先,我们创建dev分支,然后切换到dev分支:

    git checkout -b dev

git checkout 命令加上-b参数表示创建并切换,相当于以下两条命令:

    git branch dev
    git checkout dev

然后,用git branch命令查看当前分支:

    git branch
    * dev
        master

现在,dev分支的工作完成,我们就可以切换回 master分支:

    git checkout master

现在,我们把dev分支的工作成果合并到master分支上:

    git merge dev

合并完成后,就可以放心地 删除dev分支了:

    git branch -d dev

解决冲突一

1、 git merge dev 时发生冲突

git status  查看冲突

然后通过 vscode 解决冲突:

采用当前更改 | 采用传入的更改 | 保留双方更改 | 比较更改

手动解决冲突需要关注的点: 冲突是如何表示的

  • <<<<<<< HEAD — (当前更改)
  • ====== — (分割线)
  • >>>>>> release_fix — (传入的更改)

当产生合并冲突时,该部分会以<<<<<<<, =======和 >>>>>>>表示。

在=======之前的部分是当前分支这边的情况,在=======之后的部分是对方分支的情况。

2、git merge –abort 放弃 merge

抛弃当前合并冲突的处理过程并尝试重建合并前的状态。

解决冲突二

在看到冲突以后,你可以选择以下两种方式:

1、决定不合并。

这时,唯一要做的就是重置index到HEAD节点。

git merge –abort用于这种情况。

2、解决冲突。

Git会标记冲突的地方,解决完冲突的地方后使用git add加入到index中,然后使用git commit产生合并节点。


你可以用以下工具来解决冲突:

  • 使用合并工具。git mergetool将会调用一个可视化的合并工具来处理冲突合并。
  • 查看差异。git diff将会显示三路差异(三路合并中所采用的三路比较算法)。
  • 查看每个分支的差异。git log –merge -p 将会显示HEAD版本和MERGE_HEAD版本的差异。
  • 查看合并前的版本。git show :1:文件名显示共同祖先的版本,git show :2:文件名显示当前分支的HEAD版本,git show :3:文件名显示对方分支的MERGE_HEAD版本。

git submodule

添加 git submodule 库

    git submodule add http://****/web-tools.git web-tools

拉取 web-tools 代码

git submodule update --init --recursive