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.pygit 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