Repository是本地仓库(暂存区域),Remote是远程仓库。
根目录下的.git文件夹中,index文件是暂存区域,其他文件组成版本库,HEAD文件指向当前版本。
工作流程
1、本地 git 配置好远程仓库的 ssh key(公私钥)
2、在远程创建好仓库,初始化仓库时
方式一 (推荐)
(1)git clone 先把远程仓库clone到本地
(2)把本地项目中的文件剪切到clone下来的文件夹中
(3)git add -> commit -> push。push时如果之前没有绑定对应的远程账号(比如github、gitlab账号),需要先验证账号。
方式二
(1)打开本地项目的根目录,右键 -> Git Bash Here -> git init 初始化为一个本地仓库,此时会生成一个对应的.git文件夹。
(2)关联到对应的远程仓库 git remote add origin https://github.com/xxx/xxx.git
如果报错 fatal: remote origin already exists,说明此本地仓库已经关联某个远程仓库,
可git remote -v
查看已关联的远程仓库,git remote rm origin
删除已关联的远程仓库后再重试。
注意: git初始化本地仓库时创建的默认分支是master,github初始化(远程)仓库时创建的默认分支是main。可以 git checkout 切换到 main 操作,也可以将github初始化(远程)仓库时创建的默认分支改为master,总之要保证后续操作时远程、本地的主分支一致。
(3)git add -> commit
(4)git pull --rebase origin master|main
master、main根据远程仓库的主分支确定,后续不在说明。
先拉一下远程文件,不然远程仓库初始化时生成的README之类的文件本地仓库中没有,后续 push 时可能会报错 error: failed to push some refs to https://github.com/xxx/xxx.git
。
如果报错 fatal: unable to access : Failed to connect to github.com port 443: Timed out
之类 443、ssl 错误,一般是因为开着,将关闭后再试。
(5)推送到远程仓库 git push -u origin master|main
,如果之前没绑定github 之类对应的远程账号,需要先验证账号。
方式三 (推荐)
针对于 IDEA + github
Create Git Repository 相当于 git init,只是创建本地仓库。
会自动创建本地仓库、github远程仓库,并push到远程仓库中去,创建的远程分支与本地分支保持一致,均为master。要求指定的远程仓库不存在,不然会提示错误。
cd F:/program/xm-mall #先cd到项目根目录
git init #初始化当前目录为仓库,当前目录下会生成一个隐藏的.git文件夹
#也可以这样
cd F:/program
git init xm-mall #初始化指定目录为仓库,如果xm-mall不存在会自动创建
git add db.sql upload #添加文件、文件夹到暂存区域,如果有多个,空格隔开。可以使用相对路径、绝对路径,相对路径相对于当前目录,可用pwd查看当前目录
git add resource/* #可使用通配符
git add mapper/*.xml
git add . #.表示当前目录下的所有文件、文件夹
git add --all #也可以这样写
git status #查看增删改的文件哪些被添加到了暂存区域(绿色),哪些没有被添加到暂存区域(红色)
git diff #查看修改的具体内容
如果某些文件已添加到暂存区域,现在又不想提交到仓库,可以从暂存区域移除,即回退该文件的add操作
git reset HEAD db.sql #把指定的文件从暂存区域回退,有多个时空格隔开
git reset HEAD #如果缺省文件,默认为最近一次git add 添加的
git commit -m "提交sql脚本" #每次commit版本库中都会产生一个新的版本
git commit -am "提交所有修改" #添加、提交一步到位,-a即all,将所有增删改过的文件添加到暂存区域、再提交到本地仓库
git push github master #指定远程仓库、要同步的分支
git push -u github master #如果当前仓库与多个远程仓库关联,可以用-u指定一个默认的远程仓库,以后git push未指定远程仓库时,使用默认的远程仓库
git push master #如果当前仓库只与一个远程仓库关联,或者指定了默认的远程仓库,则可缺省远程仓库
git log #查看当前及之前的版本
git reflog #列出版本库中所有的版本
版本回退
有3种回退类型:都会先将工作区的文件回滚到指定版本
git reset HEAD~ #回退到当前版本的上一个版本。HEAD指向当前版本,~也可以写成^
git reset HEAD~3 #回退到当前版本的上3个版本,不指定数字时,默认为1
git reset 版本号 #回退到指定版本
git reset HEAD~ readme.md #如果指定了文件、文件,则只回退指定的文件、文件夹,有多个时空格分隔
#以上均未指定回退类型,默认为git reset --mixed,其它回退类型的用法和--mixed的相同,eg
git reset --hard HEAD~
#从远程仓库clone项目到本地
git clone [email protected]:TANGKUO/HIS.git
#从远程仓库拉取更新,会自动合并到本地的当前分支
git pull
#从远程仓库拉取更新,不会自动合并,后续需要 git merge 手动合并。然后 git checkout 检出才能使用?
git fetch
git merge 本地分支名 #合并到本地仓库的指定分支中,缺省分支名时默认合并到当前分支中
有时候需要开发某一模块,可以以分支的形式开发,分支、主干同时开发,分支开发完合并到主干上。项目默认的主干是master
git branch 分支名 #创建一个新分支,创建后的分支在本地仓库中,需要从当前分支切换过去才可以使用
git checkout 分支名 #从本地仓库中检出指定分支到工作区,即从当前分支切换到指定分支
git checkout -b 分支名 #一步到位,创建并检出|切换到该分支
git branch #查看所有分支
git branch -d 分支名 #删除分支。-d只能删除已合并到主干上的分支,如果分支尚未合并到主干上,无法用-d删除
git branch -D 分支名 #-D 强制删除,不管分支有没有合并到主干上,都可以删掉
git merge 分支名 #把指定分支合并到当前分支中。合并默认使用fast forward模式,删除分支后会丢失分支信息,也就看不出来曾经有过这个分支、做过合并
git merge --no-ff -m "合并说明" 分支名 #--no-ff 不使用ff(fast forward)模式,删除分支后在历史版本中仍可以看到该分支信息、保留合并痕迹,可以加合并说明。这种用得多
#肯定要git commit提交该分支的修改到本地仓库中后,才进行分支合并
#合并之后一般要使用git branch -d 删除分支
每次提交到本地仓库都会产生一个新的版本,Git使用一长串字符作为版本号来标识一个版本,其实也不算是版本号,只是commit id。
一串乱七八糟的字符可读性不好,如果项目开发得差不多了,要作为内测版、候选版、正式版之类的发布;或者项目进行了重大修改,要特殊标识这次提交,可以给本次提交加一个tag
git tag -a v2.0 #给最近1次提交的版本加tag,-a即add
git tag v2.0 #可以省略-a,之类写标签名
git tag v2.0 commit_id #给指定的提交版本加tag
git tag #查看所有的tag,只列出tag
git log #git log系列命令也会列出tag,信息更加详细
git show v2.0 #查看某个tag对应的提交版本的详细信息,包括提交者信息、提交时间、具体修改信息等
git tag -d v2.0 #删除指定的tag,只删除tag,不删除对应的版本
#tag默认存储在本地仓库中,删除也是删除本地仓库中的,push时默认不会推送tag
#如果要在远程仓库中使用tag,还需做一些操作
git push github v2.0 #推送指定的tag到远程仓库,标识的是上一次push提交的版本。此处的github是远程仓库别名
git push github --tags #推送本地仓库中所有的tag到远程仓库,分别标识对应的版本
git push github :refs/tags/v2.0 #在本地仓库删除tag后,同步删除操作到远程仓库
直接在windows资源管理器中删除文件、文件夹,只是物理删除,本地仓库中关于该文件、文件夹的记录还在,版本回退时依旧可以恢复。
git方式删除文件、文件夹,是物理删除 + 删除版本库中的相关信息,一旦提交,版本回退时不会回滚该文件、文件夹(不会恢复)。
git rm index.html #删除文件
git rm -r resource #删除文件夹,-r表示递归
git rm会自动把删除操作添加到暂存区,我们只需git commit提交