Git_Common_Lib_Management

Git 安装完成后,需要设置你的用户名和Email地址
git config --global user.name “"
git config --global user.email "

1.创建文件夹目录
mkdir learngit
cd learngit
pwd
2.通过git init命令把这个目录变成Git可以管理的仓库
git init
Git的仓库建好了,当前目录下多了一个.git目录,这个目录是Git来跟踪管理版本库的。如果没有看见.git目录,是因为这个目录默认是隐藏的,用ls -ah命令就可以看见
3.Notepad++的编码设置:Settings–>New Document–>UTF-8 with BOM
4.编写一个readme.txt文件,内容如下:
Git is a version control system.
Git is a free software.
5.把readme.txt放到learngit目录下(子目录也行)
6.用命令git add 告诉Git,把文件添加到仓库。
git add readme.txt
7.用命令git commit告诉Git,把文件提交到仓库。
git commit -m “wrote a readme file”
git commit命令,-m后面输入的是本次提交的说明。
备注:commit 可以一次提交很多文件,可以多次add不同的文件。
git add file1.txt
git add file2.txt file3.txt
git commit -m “add 3 files”
8.修改readme.txt文件,修改后的内容如下:
Git is a distributed version control system.
Git is free software.
运行 git status命令查看结果
git status命令可以时刻掌握仓库当前的状态,输出告诉我们,readme.txt被修改过了,但还没准备提交的修改。
9.用git diff命令查看修改了什么
10.知道看对readme.txt修改了,就可以提交了,
git add readme.txt
git status
git commit -m “add distributed”
11.修改readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
git add readme.txt
git commit -m “append GPL”
12. 用git log 查看历史记录,如果嫌输出信息太多,可以试试加上 --pretty=oneline
git log
git log --pretty=oneline

13.版本回退
Git中,用HEAD表示当前版本,上一个版本是HEAD,上上一个版本就是HEAD^,往上100个版本写成HEAD~100.
把当前版本append GPL回退到上一个版本add distributed,可以使用git reset 命令
git reset --hard HEAD^ cmd中^是转义字符,相当于linux的,所以要写成 git reset --hard HEAD"^"
cat readme.txt 查看文件的内容(Windows系统是 type readme.txt)
git log 查看提交历史 查看到最新的那个版本append GPL已经看不到了
git reset --hard 08729
git reflog 查看命令历史,以便确定要回到未来的哪个版本
git reset --hard commit_id
14.修改readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage
增加LICENSE.txt
git status
git add readme.txt
git add LICENSE.txt
git status
git commit -m “understand how stage works”
15.修改readme.txt(管理修改)
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
git add readme.txt
git status
修改readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
git commit -m “git tracks changes”
git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别
git diff: 只比较工作区和暂存区(最后一次add)的区别
git diff – cached :只比较暂存区和版本库的区别
git diff HEAD – filename :只比较工作区和版本库(最后一次commit)的区别

16.撤销修改
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My boss still prefers SVN.
git status
git checkout – readme.txt :把readme.txt文件在工作区的修改全部撤销,有两种情况:
1.readme.txt自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态。
2.readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git checkout – file 命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令。

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My boss still prefers SVN.
git add readme.txt
git status
用命令git reset HEAD 可以把暂存区的修改撤销掉,重新放回工作区。
git reset HEAD readme.txt
git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
git status
git checkout – readme.txt
17.删除文件
添加新文件test.txt
git add test.txt
git commit -m “add test.txt”
一般情况下,直接在文件管理器中把没用的文件删除,或者用rm命令
rm test.txt (Windows下应该是 del test.txt)
git status
确认删除还是恢复文件
1.确认删除,就用命令git rm删除,并且git commit
git rm test.txt
git commit -m “remove test.txt”
2.恢复文件
git checkout – test.txt (git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”)
18.远程仓库
你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,需要创建SSH Key
1.创建SSH Key
在用户主目录下,看看有没有ssh目录。如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件。没有,就打开Shell(Window下打开Git Bash),创建SSH Key
ssh-keygen -t rsa -C “@.com”

	个人实际生成SSH Key 是用以下方式
		PUTTY can be download from : http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
			.Key->SSH2 RSA Key
			.Generate
			.Save private key
			.Copy Public key for pasting into OpenSSH authorized_keys file.

19.登入GitHub,新建learngit仓库
20.把本地仓库与之关联
git remote add origin
或git remote add origin
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
下一步,把本地库的所有内容推送到远程库上,用git push命令,实际上是把当前分支master推送到远程。
git push -u origin master (由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。)
从现在起。只要本地作了提交,就可以通过命令:
git push origin master 把本地master分支的最新修改推送至GitHub
21.从远程库克隆
先创建远程库,然后,从远程库克隆。
登入GitHub,创建一个新的仓库,名字叫gitskills
勾选Initialize the repository with a README,自动会创建一个README.md文件
现在,远程库准备好了,下一步是用命令git clone 克隆一个本地库
git clone https://gitlabe*****
cd gitskills
ls

把COMMON_LIB 复制过去,
git status
git add -A  //把本地变化的所有文件提交
git commit-m "Commit from local"
git push origin master

22.分支管理
.创建与合并分支
在版本回退里,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。
HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所有,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化。
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。
假如我们在dev上的工作完成了,就可以把dev合并到master上。直接把master指向dev的当前提交,就完成了合并。所以Git合并分支很快,就改改指针,工作内容不变!
合并完分支后,甚至可以删除dev分支,删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支
实践:创建dev分支,然后切换到dev分支:
git checkout -b dev (git checkout命令加上-b参数表示创建并切换,相当于两条命令:git branch dev git checkout dev)
然后,用git branch 查看当前分支
git branch (git branch命令会列出所有分支,当前分支前面会标有一个*号)
然后,我们可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行
Creating a new branch is quick.
然后提交
git add readme.txt
git commit -m “branch test”
现在,dev分支的工作完成,我们就可以切换回master分支:
git checkout master
切换回master分支后,再查看一个readme.txt文件。刚才添加的内容不见了!因为刚才提交是在dev分支,而master分支此刻的提交点并没有变
现在,我们把dev分支的工作成果合并到master分支上
git merge dev (git merge 命令用于合并指定分支到当前分支)
合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
注意到合并时显示的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
合并完成后,就可以放心地删除dev分支了
git branch -d dev
删除后,查看branch,就只剩下master分支了
git branch
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删除分支,这和直接在master分支上工作效果是一样的,但过程更安全。
查看分支: git branch
创建分支: gui branch
切换分支: git checkout
创建+切换分支: git checkout -b
合并某分支到当前分支: git merge
删除分支: git branch -d

.解决冲突
	.准备新的feature1分支,继续我们的新分支开发
		git checkout -b feature1
	.修改readme.txt最后一行,改为
		Creating a new branch is quick AND simple.
	 git add readme.txt
	 git commit -m "AND simple"
	.切换到master分支
	 git checkout master
	.Git还会自动提示我们当前master分支比远程的master分支要超前1个提交
	.在master分支上把readme.txt 文件的最后一行改为:
	 Creating a new branch is quick & simple.
	.提交
	 git add readme.txt
	 git commit -m "& simple"
	.现在,master分支和feature1分支各自都分别有新发提交
	.这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
	 git merge feature1
	.果然冲突了。Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件
	 git status
	.打开readme.txt,修改如下后保存:
	 Creating a new branch is quick and simple.
	.再提交
	 git add readme.txt
	 git commit -m "conflict fixed"
	.用带参数的git log 也可以查看分支的合并情况:
	 git log --graph --pretty=oneline --abbrev-commit   (用git log --graph 命令可以查看分支合并图)
	.最后,删除feature1分支
	 git branch -d feature1
.分支管理策略
	.通常,合并分支时,如果可能,Git会用Fast forward模式,但在这种模式下,删除分支后,会丢掉分支信息。
	 如果要强制禁止用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
	.下面用--no-ff方式的git merge
	 	首先,仍然创建并切换dev分支
			git checkout -b dev
		修改readme.txt文件,并提交一个新的commit
			git add readme.txt
			git commit -m "add merge"
		现在,切换回master
			git checkout master
		准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward
			git merge --no-ff -m "merge with no-ff" dev   (因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去)
		合并后,我们用git log 看看分支历史

	合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而Fast forword合并就看不出来曾经做过的合并。
.Bug分支
	每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除
	当你接到一个修复一个代号101的bug任务时,很自然地,你想创建一个分支issue-101来修复它。但是,目前正在dev上进行的工作还没有提交:
	并不是你不想提交,而是工作只进行到一半,还没办法提交,预计完成时间还需要1天。但是,你必须在两个小时内修复该Bug,怎么办?
	Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
		git stash
	现在,用git status查看工作区,就是干净的,因此可以放心地创建分支来修复Bug
	首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
		git checkout master
		git checkout -b issue-101
	现在修复Bug,需要把"Git is free software..."改为"Git is a free software...",然后提交
		git add readme.txt
		git commit -m "fix bug 101"
	修复完成后,切换到master分支,并完成合并,最后删除issue-101分支
		git checkout master
		git merge --no-ff -m "merged bug fix 101" issue-101
		git branch -d issue-101
	现在,回到dev分支继续干活
		git checkout dev
		git status
	工作区是干净的,用git stash list命令查看
		git stash list
	工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
		一是用 git stash apply 恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
		另一种方式是用 git stash pop,恢复的同时把stash内容也删除了;
		git stash pop 
		现在用git stash list查看,就看不到任何stash内容了;
		git stash list
	你可以多次stash,恢复的时候,先用git stash list 查看,然后恢复指定的stash,用命令:
		git stash apply stash@{0}	
.Feature分支
	添加一个新功能时,新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
	新任务:开发代号为Vulcan的新功能,该计划用于下一代星际飞船。
		git checkout -b feature-vulcan
	开发完毕
		git add vulcan.py
		git status
	切回dev,准备合并:
		git checkout dev
	如果一切顺利的话,合并到dev分支
		git merge --no-ff -m "merged feature-vulcan" feature-vulcan
		git branch -d feature-vulcan
	但是,此时接到命令,因经费不足,新功能必须取消,这个包含机密资料的分支还是必须就地销毁:
		git branch -d feature-vulcan
	销毁失败,Git友情提示,feature-vulcan分支还没有被合并,如果删除,就丢失掉修改,如果强行删除,需要使用大写的 -D 参数
		git branch -D feature-vulcan
.多人协作
	当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin .
	要查看远程库的信息,用git remote 
		git remote
	或者用git remote -v 显示更详细的信息:
		git remote -v 
	上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
.推送分支
	就是把该分支上的所有本地提交推送到远程库,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的分支上:
		git push origin master
	如果要推送到其它分支,比如dev,就改成
		git push origin dev
 	哪些分支需要推送:
		.master分支是主分支,因此要时刻与远程同步
		.dev分支是开发分支,团队所有成员都需要在上面工作,所以也要与远程同步。
		.bug分支只用于在本地修复bug。
		.feature分支
.抓取分支
	多人协作时,大家都会往master和dev分支上推送各自的修改
		git clone https://gitlabe2.ext.net.nokia.com/panfhuan/gitskills.git
	从远程库clone时,默认情况下,只能看到本地的master分支。
		git branch
	现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,
		git checkout -b dev origin/dev
	现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程
		cat env.txt
		git add env.txt
		git commit -m "add env"
		git push origin dev
	你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送。
	解决方法:先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
		git pull
	git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接
		git branch
	再pull
		git pull
	这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中解决冲突完全一样,解决后,提交,再push
		git commit -m "fix new conflict"
		git push origin dev
	多人协作的工作模式:
		1试图用git push origin <branch-name>推送自己的修改
		2如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
		3如果合并有冲突,则解决冲突,并在本地提交;
		4没有冲突或者解决冲突后,再用git push origin <branch-name> 推送就能成功
		如果git pull 提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch --set-upstream-to <branch-name> origin/<branch-name>

	小结:
		.查看远程库信息,使用git remote -v
		.本地新建的分支如果不推送到远程,对其他人就是不可见的
		.从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交
		.从本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
		.建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
		.从远程抓取分支,使用git pull,如果有冲突,要先处理冲突
		
.Rebase
	多人在同一个分支上协助时,很容易出现冲突。即使没有冲突,后面push的童鞋不得不先pull,在本地合并,然后才能push成功	
	Git有一种称为rebase的操作,有人把它翻译成“变基”。rebase操作可以把本地未push的分叉提交历史整理成直线。

标签管理:
发布一个版本时,通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针。
.创建标签
首先,切换到需要打标签的分支上:
git branch
git checkout master
然后,敲命令git tag 就可以打一个新标签:
git tag v1.0
可以用命令git tag 查看所有标签:
git tag
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
git log --pretty=oneline --abbrev-commit
比如说要对add merge这次提交打标签,它对应的commit id是f52c633
git tag v0.9 f52c633
再用命令git tag查看标签
git tag
注意,标签不是按照时间顺序列出的,而是按字母排序的。可以用git show 查看标签信息
git show v0.9
还可创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a v0.1 -m “Version 0.1 released” 1094adb
git show v0.1
注意,标签总是和某个commit挂钩的。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

	小结:
		.命令git tag <tagname> 用于创建一个标签,默认为HEAD,也可以指定一个commit id;
		.命令git tag -a <tagname> -m "blabala" 可以指定标签信息
		.命令git tag 可以查看所有标签
.操作标签
	如果标签打错了,也可以删除
		git tag -d v0.1
	因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全地删除
	如果要推送某个标签到远程,使用命令 git push origin <tagname>
		git push origin v1.0
	或者,一次性推送全部尚未推送到远程的本地标签
		git push origin --tags
	如果标签已经推送到远程,要删除远程标签,先从本地删除:
		git tag -d v0.9
	然后,从远程删除,删除命令也是push,格式如下:
		git push origin :refs/tags/v0.9
	小结:
		命令git push origin <tagname> 可以推送一个本地标签;
		命令git push origin --tags可以推送全部未推送的本地标签;
		命令git tag -d <tagname> 可以删除一个本地标签;
		命令git push origin :refs/tags/<tagname> 可以删除一个远程标签

自定义Git
让Git显示颜色,让命令输出看起来更醒目:
git config --global color.ui true
忽略特殊文件:
有些特殊文件如保存了数据库的密码的配置文件,必须存放在Git目录下,但不能提交它们,
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则:
1.忽略操作系统自动生成的文件,比如缩略图等;
2.忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没有必要放进版本库,比如Java编译产生的.class文件;
3.忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件,
EX:
Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下会有Desktop.ini文件,因此你需要忽略Windows自动生成的垃圾文件:
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
然后继续忽略Python编译产生的.pyc、.puo、dist等文件或目录:
# Python
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
加上自己定义的文件,最终得到一个完整的.gitignore文件
自定义文件
# My configuration
db.ini
deploy_key_rsa
最后一步就是把.gitignore也提交到Git.检验.gitignore的标准是git status 命令是不是说working directory clean
有时候,你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了。如果你确实想添加该文件,可以用-f强制添加到Git:
git add App.class (git add -f App.class)
如果你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore 命令检查
git check-ignore -v App.class
Git会告诉我们,.gitignore的第3行规则忽略了该文件
小结:
.忽略某些文件时,需要编写.gitignore;
. .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理。
配置别名
用st表示status
git config --global alias.st status
用co表示checkout
git config --global alias.co checkout
用ci表示commit
git config --global alias.ci commit
用br表示branch
git config --global alias.br branch
配置Git的时候,加上–global是针对当前用户起作用的,如果不加,只针对当前的仓库起作用
每个仓库的Git配置文件放在.git/config中,别名在[alias]后面,要删除别名,直接把对应的行删掉即可。
当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中

猜你喜欢

转载自blog.csdn.net/qq_39703212/article/details/109100479
lib