Git 基础操作

2019-12-05   


用户注册

名字随意

git config --global user.name "YilingLiang"
git config --global user.email "15600992130@163.com" #相当于注册
git config --list

Git三个

工作区、暂存区、Git仓库,相当于三个文件夹。

  • 工作区(Working Directory):平时看得见的文件夹
  • 暂存区(Stage , Index):保存了改动,即将提交到Git仓库的列表信息
  • Git仓库(Repository)或称版本库:有所有版本数据,head指向最新提交

Git工作流程

  • 在工作目录中添加、修改文件
  • 将需要进行版本管理的文件放入暂存区
  • 将暂存区提交到Git仓库

Git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

git init # 初始化一个Git仓库
# 创建文件p1.txt,将工作目录文件放到Git仓库只需两步
git add p1.txt #添加到暂存区
git commit -m "a new file p1.txt" #引号内是提交的说明

查看状态:

git status # On branch master(主分支)
# 创建 license.txt
git status # 提示新加文件没有进暂存区(红色提示)
git add license.txt
git status # 提示新加文件在暂存区但没有进仓库(绿色提示)

在暂存区的可以反悔,进行撤销操作

git rm --cached license.txt # 从暂存区取出
git restore --staged license.txt # 从暂存区取出

区别于:

git restore <file> # 表示将在工作空间但是不在暂存区的文件撤销更改

git reset HEAD #将暂存区域恢复到先前状态(该操作是将commit的内容恢复到暂存区,不影响工作区)
git status # 提示新加文件没有进暂存区(红色提示)
git add license.txt
git commit -m "add license.txt"
git status # 正常提示
git diff file # 查看file文件相对于暂存区修改了哪些内容

如果发现 license.txt 有个东西写错了,修改了一下,此时有两种选择,一种是恢复之前(checkout),一种是覆盖更新暂存区。

git status # 提示文件有修改(红色提示)
git add license.txt # 覆盖更新
# git checkout license.txt # 恢复之前
# checkout是个有威胁的命令,会把之前暂存区的弄到工作区

查看历史提交(所有版本)

git log # 提交记录从近到远排列 git log --pretty=oneline

6eb48c4543bf99f7a2a58be83d2069493168e139 是一个唯一id对应不同版本,可用于精确恢复版本。

回到过去

回顾

  • add命令将文件从工作区送入暂存区
  • commit将暂存区送入Git仓库
  • reset将Git仓库恢复到暂存区
  • checkout将暂存区恢复到工作区
git reset HEAD~ # 表示回到HEAD前一个;~~是上上个;~10,表示前第10个
# 这个操作是不可逆的,除非记住了HEAD对应的id
# 这个id可以通过git reflog 得到(HEAD的移动轨迹)
# git reset eb48c4543bf99f7a2a58be83d20694
git reset --mixed HEAD~ # 默认的,会移动HEAD到前一个,并将HEAD移动后指向的回退到暂存区
git reset --soft HEAD~ # 会移动HEAD到前一个,但暂存区不动
git reset --hard HEAD~ # 移动HEAD到前一个,并将HEAD移动后指向回退到暂存区,并将暂存区回退到工作目录(有危险)
git reset HEAD #是将暂存区和HEAD的提交保持一致 --mixed(后两区一致)
git reset --hard HEAD #是将工作区、暂存取和HEAD保持一致(三区一致)

回到过去,通过 git reset --hard ID 再去到未来。

git reset --hard HEAD #会将本地Git仓库恢复到暂存区和工作目录(因为三者一致)

修改提交说明、删除文件、重命名文件

git commit --amend # 修改提交说明,该操作撤销上一次提交,并讲暂存区文件重新提交

工作目录中修改文件会被 git status 发现。场景:有价值的代码会存入暂存区,如果当前工作区代码写的不满意,想要把暂存区的拿回来:

git restore/checkout license.txt

即撤销修改可以通过 git restore/checkout license.txt

如果要删除暂存区:

git rm --cached license.txt # 从暂存区取出 只删暂存区
git restore --staged license.txt # 从暂存区取出 只删暂存区

删除文件:

git rm y.png # 只删除工作目录和暂存区,不会删除Git仓库的

想彻底删除可在上命令执行后用 reset

git reset --soft HEAD~

如果删除了工作目录的,但又新建了另一个同名的,可用 git rm -f y.png 强制删除这两个同名的。

git rm --cached y.png # 只删暂存区

重命名文件:

git mv old new # 修改工作目录和暂存区

分支管理

注:暂存区和工作区都是只有一个,并没有多个暂存区

git branch newname # 创建分支
git checkout newname # 切换分支
git checkout -b newname # 创建并切换分支
git branch # 查看所有分支和当前所处分支

删除分支:

git branch -d branch_name # 删除本地仓库的branch_name分支

虽然分支被删除但文件还在,因为git管理本质是指针移动

// 删除远程分支
git push origin --delete remoteBranchName

将 branch_name 合并到当前分支:

git merge branch_name # 内容不能有冲突

如果有冲突需要解决冲突。

Github

git remote add origin http://github.com/YilingLiang/TEST # 我的学git的测试仓库
# 表示连接到 github 上的 TEST 仓库并创建别名 origin,之后 push 和 pull 就用到这个别名就行。
git push -u origin master # 第一次push需要 -u
# 创建一个 upStream (上传流),并将本地代码通过这个 upStream 推送到别名为 origin 的仓库中的 master 分支上。-u ,就是创建 upStream 上传流,如果没有这个上传流就无法将代码推送到 github;同时,这个 upStream 只需要在初次推送代码的时候创建,以后就不用创建了。

出现错误:

fatal: remote origin already exists

则执行以下语句后重新 add origin:

git remote -v # 查看本地添加了哪些远程地址
git remote rm origin

注意:上传时不能出现 Github 仓库有的 commit 本地却没有,这样会报错。如果远程删除了 Github 仓库文件或远程新建了文件或,可以用 git pull --rebase origin master 和本地的合并,然后再 git push

或者更加简单粗暴:git push -f

GitAcwing

如果第一次要将代码传到云端,云端新建项目不要添加任何文件包括readme。

首先配置ssh秘钥登录,将公钥上传到云仓库。

接着:

git remote add origin git@git.acwing.com:yilingliang/project.git # 
git push -u origin master # -u仅第一次需要

就上传到云端仓库了。

将本地的其它分支 branch_name 上传到云端:

git checkout branch_name
git push origin branch_name

在新机器上下载该项目代码:

git clone git@git.acwing.com:yilingliang/project.git # ssh克隆

云端分支合并到本地以及本地其它:

git push --set-upstream(缩写-u) origin branch_name # 设置本地的branch_name分支对应远程仓库的branch_name分支
git push -d origin branch_name # 删除远程仓库的branch_name分支

git pull # 将远程仓库的当前分支与本地仓库的当前分支合并
git pull origin branch_name # 将远程仓库的branch_name分支与本地仓库的当前分支合并
git branch --set-upstream-to=origin/remote_branch local_branch # 将远程的remote_branch分支与本地的local_branch分支对应(需要先将远程合并到本地才行)
# 注:上语句的效果是,在local_branch下git pull就可以将不同名的远程的拉到本地
git checkout -t origin/branch_name # 将远程的branch_name分支拉取到本地
git push origin local_branch:remote_branch # 本地上传到远程(不同名之间)

http 和 ssh 连接 git 的区别

https git clone是长这样的:

git clone https://github.com/project/repo.git

ssh git clone是长这样的:

git clone git@github.com:project/repo.git

区别就是所用的协议不同:

https 用 443 端口,可以对 repo 根据权限进行读写,只要有账号和令牌就可进行操作。
ssh 则用的是 22 端口,也可以对 repo 根据权限进行读写,但是需要 SSH Keys 授权,这个 key 是通过 ssh keygen 生成器生成的,然后放在 github 的 ssh 秘钥中作为授权的证据,这样的话就不需要用户名和密码进行授权了。

.gitignore

target          //忽略这个target目录
angular.json    //忽略这个angular.json文件
log/*           //忽略log下的所有文件
css/*.css       //忽略css目录下的.css文件
**/bin //忽略多个上层文件夹

Q.E.D.


我是星,利剑开刃寒光锋芒的银星,绝不消隐