用户注册
名字随意
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.