GIT笔记
创建一个仓库总体流程
配置SSH Key
1.在Git bash中设置git的user name和email,有了就忽略此步
git config --global user.name "Liang"
git config --global user.email "152xxxxxxxx@163.com"
2.生成SSH Key
ssh-keygen -t rsa -C "152xxxxxxxx@163.com"
3.查看是否生成,若有下面两个表示成功
$ cd ~/.ssh
$ ls
id_rsa id_rsa.pub
4.复制id_rsa.pub的开头
5.在Github中的setting里面,将刚在复制的开头粘贴进去即可
创建本地仓库文件夹
1.创建版本库文件夹(mkdir一个文件夹)
2.cd到该文件夹中(可用pwd查看当前目录地址)
3.使用git init创建为仓库(可用ls-ah查看隐藏的目录)
添加远程库(与本地库关联)
4.在Github中创建一个仓库,最好名称和本地创建的相同,在bash中创建版本库的位置输入如下,已经存在会提示已经存在
$ git remote add origin https://github.com/Rxxx-l/learngit.git
fatal: remote origin already exists.
5.输入如下,就可以把本地库的所有内容推送到远程库上,由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
$ git push -u origin master
6.刷新Github看到同步成功
7.可用命令查看远程库信息:
$ git remote -v
返回上一级目录命令为:
$ cd ..
PUSH文件到远程库
8.git add 文件,将文件放到暂存文件区
9.git commit -m “提交说明”,将文件提交到仓库中,可add多个文件后,一次提交多个文件
10.push主分支到GitHub或Gitee
git push origin master
远程clone库
Clone自己的有SSHKey的库后,可以直接push,可省略上述添加库的步骤
$ git clone https://github.com/Rambo-l/gitskills
Cloning into 'gitskills'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 591 bytes | 3.00 KiB/s, done.
clone后push失败问题
我先用https clone我的库下来
添加东西后push出现:
$ git push origin master
remote: LiangBo: Incorrect username or password (access token)
fatal: Authentication failed for 'https://gitee.com/liangbo1996/xxxCar/'
发现ssh的地址和https地址有区别的,我是添加的ssh key
所以先在本地删除远程的库
$ git remote rm origin
再用ssh地址连接远程库:
$ git remote add origin git@gitee.com:liangbo1996/xxxCar.git
后面就可以push了4.在仓库目录下创建自己的文件
版本回退及撤销修改
版本回退
1.先用git log查看提交记录
2.git reset --hard HEAD^回退一次,几个 ^就是回退几次,也可用–hard HEAD~n表示退n次,还可用–hard commit id退回到指定的版本)
撤消修改
1.命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态
2.若要撤回已存入暂存区的文件,先git reset HEAD 当我们用HEAD时,表示最新的版本。再使用git checkout – file丢弃工作区的修改
删除文件
在另外一台电脑上push origin master
1.登录设置用户名和邮箱先生成并在gitee或github上添加SSH KEY,然后克隆对应的仓库
2.在本地电脑上新建文件夹,名字最好和仓库相同,在git init一下创建成功
$ git init
Reinitialized existing Git repository in C:/Users/Administrator/Desktop/clone/note/.git/
3.远程关联仓库
git remote add git@gitee.com:xxxxxx/note.git
4.查看是否关联
$ git remote -v
origin git@gitee.com:xxxxxx/note.git (fetch)
origin git@gitee.com:xxxxxx/note.git (push)
5.然后就可以push文件啦,第一次push时会提示设置密码,这是你push文件的时候要输入的密码,而不是github或gitee管理者的密码,直接敲回车可以不输入密码,以后推送也不用输入密码
6.不过如果两台电脑使用同一个账号去操作同一个远程库时,git push某一台电脑上的文件出现push失败的情况,如下:
$ git push origin master
To gitee.com:liangbo1996/note.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'gitee.com:liangxxxxxx/note.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
应该是远程库被另一台电脑修改更新过,查看报错信息提示使用git pull,我试了下:
$ git pull origin master
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 12 (delta 3), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (12/12), 25.27 MiB | 339.00 KiB/s, done.
From gitee.com:liangbo1996/note
* branch master -> FETCH_HEAD
abf0338..774410d master -> origin/master
Merge made by the 'recursive' strategy.
"23-2019.09.07-\346\242\201\345\215\232.docx" | Bin 0 -> 374043 bytes
"23-2019.11.2-\346\242\201\345\215\232.docx" | Bin 0 -> 6910806 bytes
"23-2019.12.9-\346\242\201\345\215\232.docx" | Bin 0 -> 13764765 bytes
"23-2019.9.27-\346\242\201\345\215\232.docx" | Bin 0 -> 525329 bytes
"23-20191115-\346\242\201\345\215\232.docx" | Bin 0 -> 952749 bytes
"23-20191129-\346\242\201\345\215\232.docx" | Bin 0 -> 15609488 bytes
"23-\346\242\201\345\215\232-20191220.docx" | Bin 0 -> 1649794 bytes
liangbo.docx | Bin 0 -> 476244 bytes
8 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 "23-2019.09.07-\346\242\201\345\215\232.docx"
create mode 100644 "23-2019.11.2-\346\242\201\345\215\232.docx"
create mode 100644 "23-2019.12.9-\346\242\201\345\215\232.docx"
create mode 100644 "23-2019.9.27-\346\242\201\345\215\232.docx"
create mode 100644 "23-20191115-\346\242\201\345\215\232.docx"
create mode 100644 "23-20191129-\346\242\201\345\215\232.docx"
create mode 100644 "23-\346\242\201\345\215\232-20191220.docx"
create mode 100644 liangbo.docx
然后再git push就可以了(这里我pull了两遍,第一遍没成功,若一次失败,可以多pull几遍试试):
$ git push origin master
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 2.21 KiB | 2.21 MiB/s, done.
Total 5 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:liangbo1996/note.git
774410d..7170ec6 master -> master
7.git pull命令用于从另一个存储库或本地分支获取并集成(整合)。git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。相当于:
$ git fetch origin
$ git merge origin
8.git pull失败,若是本地库是创建的而不是克隆的两个库git pull 会出现:
$ git pull origin master
From gitee.com:liangbo1996/xxxCar
* branch master -> FETCH_HEAD
fatal: refusing to merge unrelated histories
解决方法允许合并不相关的库:
$ git pull origin master --allow-unrelated-histories
From gitee.com:liangbo1996/xxxCar
* branch master -> FETCH_HEAD
Merge made by the 'recursive' strategy.
README.en.md | 36 ++++++++++++++++++++++++++++++++++++
README.md | 39 +++++++++++++++++++++++++++++++++++++++
2 files changed, 75 insertions(+)
create mode 100644 README.en.md
create mode 100644 README.md
error: Your local changes to the following files would be overwritten by merge解决
报错
error: Your local changes to the following files would be overwritten by merge:
新修改的代码的文件,将会被git服务器上的代码覆盖,若不想覆盖:
git stash
git pull origin master
git stash pop
后面再add,commit,push就行了
分支管理
创建与合并分支
1.如下图,master为主分支,原来的Head是指向master,当创建新分支dev时,Head指向dev,从现在开始每次提交dev指针会向前移动。
2.当需要合并dev和master时,只需将master指向dev的当前提交,完成合并
3.合并完分支后,也可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支
4.创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
5.git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
6.列出所有分支,当前分支前面会标一个*号
$ git branch
* dev
master
7.在分支上正常提交,切换为主分支master,查看文件发现不是刚才dev的内容
$ git checkout master
Switched to branch 'master'
8.git merge 合并分支,合并完用git branch -d dev删除分支
$ git merge dev
Updating d4b5c02..5c3d1f8
Fast-forward
readme.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
9.切换分支使用git checkout branch,而前面讲过的撤销修改则是git checkout – 文件,同一个命令,有两种作用。实际上,切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支:
创建并切换到新的dev分支,可以使用:
$ git switch -c dev
切换到指定分支命令:
$ git switch master
解决冲突
1.当在master主分支上对readme.txt进行修改提交,在feature1分支上也对readme.txt进行修改提交,这样合并时Git会报在readme.txt上发生冲突
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
2.可以用Git status查看冲突
3.cat 文件,查看文件发现,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
$ cat readme.txt
Git is distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick on master.
=======
Creating a new branch is quick.
Switch to a new branch 'feature'.
>>>>>>> feature1
4.修改冲突文件为期望的内容,然后提交,用git log查看,最后删除feature1分支
$ git log --graph --pretty=oneline --abbrev-commit
* c1ea991 (HEAD -> master) conflict fixed
|\
| * bd57ea1 (feature1) AND simple
* | fb3e246 & simple
|/
* 5c3d1f8 branch test
* d4b5c02 (origin/master) add test.txt
* 093611a commit to resposity
* 85f13c8 git tracks changes
* bc1851d understand how stages works
* 71919de add LICENSE
* 1dfdd8e append GPL
* 448cc65 add distributed
* d2f9743 wrote a readme file
分支管理策略
通常合并分支,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。下面实战一下–no-ff方式的git merge:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
上图为团队分支示意图
Bug分支
1.当在工作时需要完成另一项工作时,可以用git stash将当前工作现场隐藏
$ git stash
Saved working directory and index state WIP on master: 9326f26 merge with no-ff
首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
修复Bug完毕后,用 git stash list查看刚才的工作。工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
2.你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
3.开发一个新feature,最好新建一个分支,如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
多人协作
1.git clone项目到本地,这是只看得到master主分支
2.要在dev分支上开发,就必须创建远程origin的dev分支到本地,于用这个命令创建本地dev分支:
$ git switch -c dev origin/dev
Switched to a new branch 'dev'
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
3.提交自己的文件到dev分支,然后推送到Github上的dev分支
$ git push origin dev
若别人最新提交和你试图推送的提交有冲突
1.首先,可以试图用git push origin 推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3.如果合并有冲突,则解决冲突,并在本地提交;
4.没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
5.如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
标签管理
创建标签
1.创建标签,默认在最新的commit上打标签:
$ git tag v1.0
2.如果想给指定commit打标签,先用git log查看commit id 然后用:
$ git tag vx.x f52c633(commit id)
3.可以用git show vx.x查看标签信息
4.还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字,如:
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
操作标签
1.删除标签
$ git tag -d v0.1
2.推送标签到远程
$ git push origin v1.0
3.一次性推送全部尚未推送到远程的本地标签
$ git push origin --tags
4.如果标签已经推送到远程,要先从本地删除
$ git tag -d v1.0
5.然后,从远程删除,删除命令也是push,格式如下,这里有可能因为网络原因会报错,多试几次
$ git push origin :refs/tags/v1.0
Git命令
git add 文件,添加文件到暂存区
git commit 文件,提交文件到仓库
git status,查看当前仓库状态
git diff ,查看修改,git diff HEAD – 文件 查看工作区文件和版本库中的文件区别
git log,查看修改记录
cat 文件 ,查看文件内容,
git checkout – 文件, 撤消修改
git branch,查看分支
git branch ,创建分支
git checkout 或者git switch ,切换分支
git checkout -b 或者git switch -c ,创建+切换分支
git merge ,合并某分支到当前分支
git branch -d ,删除分支
git reset --hard HEAD^版本回退
rm 文件, 删除文件
Git手册
廖老师教程中的Git手册,可以查命令什么的
Git 手册.