一、基本操作
-
将当前目录初始化一个git仓库
git init
-
将文件快照放入暂存区域
git add 文件
-
提交更新,找到暂存区域的文件,将快照永久存储到git仓库
git commit -m "提交信息,建议写有意义的详细信息,方便从历史记录中找到改动记录"
可以多次git add 不同文件,commit一次将暂存区所有修改提交 -
查看仓库当前状态
git status
下面的命令输出告诉我们,demo.txt被修改过,但未提交
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: demo.txt
no changes added to commit (use "git add" and/or "git commit -a")
-
查看修改的内容
git diff 文件
-
查看提交日志
git log
如果看的眼花缭乱,可以加上--pretty=oneline
-
回退到某一版本
git reset --hard 某一版本
回退到往上100个版本
HEAD
表示当前版本
HEAD^
表示上一个版本
HEAD^^
表示上上一个版本
HEAD~100
表示往上100个版本 -
回到之前最新版本
git reset --hard 版本id
id越长越好,不然容易找到多个版本号- 在命令行窗口还没关闭的情况下,找到那一版本的commit id(一串十六进制)
- Git提供了一个命令记录你的每一次命令
git reflog
可以从中找到对应commit id
-
撤销修改
git checkout -- 文件
回退到最近一次git commit
或git add
时的状态
命令中--
很重要,没有就变成“切换到另一个分支” -
撤销暂存区的文件,重新放回工作区
git reset HEAD 文件
-
删除文件
git rm 文件
- 第一种情况
git rm
并且git commit
将删除版本库的文件。 - 第二种情况
git checkout -- 文件
将被删除的文件恢复到最新版本。
- 第一种情况
二、远程仓库
-
创建SSH Key
ssh-keygen -t rsa -C "邮箱"
会在用户主目录下生成.ssh目录
id_rsa
私钥,不可泄露
id_rsa.pub
公钥,可以告诉任何人 - 在GitLab上添加SSH密钥(公钥)
- 在GitLab中创建仓库,并复制仓库的SSH格式的URL(注意不是地址栏的URL)
添加远程仓库
-
关联远程库,在本地仓库下运行命令
git remote add origin 仓库URL
这里是GitLab仓库的URL
其中origin
是远程库的名字,可以修改。 -
将本地库内容推送到远程库
git push -u 远程库名称 master
用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令git push 远程库名称 master
推送到GitLab
从远程库克隆
git clone 远程仓库的URL
//这样本地仓库就已经将远程仓库项目克隆下来了。
三、分支管理
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
-
创建并切换分支
git checkout -b 分支
git checkout
命令加上-b
表示创建并切换,相当于一下两条命令
git branch 分支
git checkout 分支
查看当前分支
git branch
切换分支
git checkout 分支
合并指定分支到当前分支
git merge 指定分支
删除分支
git branch -d 分支
-
解决冲突
修改dev分支后
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
//修改分支后,从分支切换到master时,Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。
如果此时再修改master分支内容,合并时会提示冲突
$ git merge feature1
Auto-merging demo.txt
CONFLICT (content): Merge conflict in demo.txt
Automatic merge failed; fix conflicts and then commit the result.
//Git告诉我们,demo.txt文件存在冲突,必须手动解决冲突后再提交。
git status也可以告诉我们冲突的文件
在文件内容中Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
将冲突的内容统一,解决冲突内容后重新提交即可。
- 查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
git log --graph
查看分支合并图
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
- 禁用
Fast forward
模式,创建分支
git merge --no-ff -m "详细合并信息" dev
BUG分支
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,当前正在dev上进行的工作还没有提交。
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等修改BUG以后恢复现场继续工作:
-
将当前工作现场“储藏”起来,等以后恢复现场继续工作
git stash
现在用git status
查看工作区,工作区就是干净的(除非没有被Git管理的文件) -
查看“储藏”的工作现场
git stash list
-
恢复最近一次“储藏”的工作现场
git stash apply
恢复指定工作现场,通过git stash list
查看工作现场的序号,将(stash@{序号})追加到命令后面
注意,序号越靠后,说明储藏的时间越长
这样恢复后,stash内容并不会删除,需要手动删除 -
删除“储藏”的工作现场
git stash drop
-
恢复并删除“储藏”的工作现场
git stash pop
-
master分支出现bug,说明dev同样也存在,Git专门提供了命令,让我们复制一个特定的提交到当前分支
git cherry-pick 特定的提交id
Feature分支
软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
如果在feature分支还没有合并前,需要取消这个功能,删除时会销毁失败,需要使用大写的-D
参数强制删除。
git branch -D 分支
多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
-
查看远程库的信息
git remote -v
-v
表示详细信息 -
推送分支
git push 远程库名称 本地分支名称
-
抓取分支
git clone 远程仓库的URL
默认只能看到本地的master分支
如果要在dev分支上开发,就必须创建远程origin的dev分支到本地
git checkout -b dev origin/dev
创建并且还dev分支,并将远程库origin/dev 弄下来
如果最新提交和你推送的提交有冲突,先用git pull
把最新提交抓下来,然后在本地合并,解决冲突,再提交。
//git pull 失败
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
//原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接
设置本地分支dev与远程分支origin/dev的链接
git branch --set-upstream-to=origin/dev dev
多人协作工作模式
尽量将冲突在本地解决
- pull远程库内容到本地先进行合并
- 如合并冲突,则解决冲突
- 如没有冲突或解决后,再commit 并push到远程库
四、遇到的问题
- HTTP Basic: Access denied 错误
- 如果账号密码变动,使用
git config --system --unset credential.helper
重新输入账号密码 - 如果第一条命令解决失败,使用
git config --global http.emptyAuth true
- 还可以进入 控制面板>>用户账号>>凭据管理器>>windows凭据>>普通凭据 ,在里面找到git,可以编辑用户密码