Git帮助

$git$的帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
****更多教程访问:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
*填写姓名
安装git了以后还要填写姓名/邮箱,为每次提交的姓名/邮箱,命令为:
git config --global user.email "你的邮箱"
git config --global user.name "你的名字"
*新建仓库
新建一个文件夹,在该文件夹内输入git init即可把这个文件夹变成一个仓库
*操作的提交
在仓库里的操作每次都要提交,如果没有提交在命令行的左边会有一个黄色的“×”
提交命令:
git add *** 表示修改或新建了一个文件,文件名为***
git rm *** 表示删除了一个文件,文件名为***
注意:以上命令均要在已经修改后输入,否则会报错
提交后发现命令行左边还是有一个黄色的“×”,因为每次提交还要完成,完成命令:
git commit -m "对本次完成的注释"
*查看仓库的提交记录
命令:
git log 表示查看之前所有的提交,每一次的提交格式应该是这样的:
第一行:提交的编号,一窜和乱码类似的东西,但还是有用的。
第二行:提交的作者,之前提交的作者
第三行:提交的日期,日期很详细,甚至连时区都有
第四行:提交的注释,直接用commit -m 写的注释。
注意:git log 还可以再后面加上参数 --pretty=oneline这样就只会显示编号和注释
*恢复仓库至之前的版本
命令:
git reset --hard *** 表示回复到之前的版本,其中的***可以为之前git log上看到的版本编号(可以只写版本号的前几位,但不能太少,这个命令也是可以回到未来的版本的),也可以为HEAD^,加一个“^”表示回退一个版本,加两个表示回退两个版本,如果要回退很多次,可以改为HEAD~x ,表示回退x个版本,x自己定。

*查看所有的提交记录(回退也算)
命令:
git reflog 表示查看所有的记录,包括回退,好处是回退了以后用git log是看不到之前的记录的,用这个就能看到了。
*删除文件
命令: git rm *** 表示在工作区中删除了***
*远程仓库
注意!!!!这才是重头戏!!!!!
远程仓库使用github,github是用于辅助git的。
首先,github需要知道你的公开SSH秘钥,安装SSH代码:
ssh-keygen -t rsa -C "邮箱" 表示添加一个SSH,这并不是git的语法,然后在~/.ssh里会看到两个东西,一个为id_rsa这个为私密SSH,千万不能泄露给别人,另外一个为id_rsa.pub这个是公开SSH,可以告诉别人,用来验证身份。
为电脑添加完SSH后,就需要到github上添加你的SSH,复制公开秘钥里的所有东西,然后到github里,settings->SSH and GPG key's,添加一个SSH,标题自拟,内容就是刚刚复制的。
添加完SSH后,就在自己电脑的git仓库里输入代码:
git remote add origin git@github.com:用户名/项目名.git
这段代码表示这个git仓库和刚刚输入的项目名同步(项目要提前在github上新建好)。
然而,这个同步并不是直接同步,这也是需要提交(不是提交到在暂存区)至github才能同步的,提交代码为:
git push -u origin master 表示把这个文件夹里的所有东西都同步到github上,那个-u只有在第一次提交时要加,以后就不用了。
在第一次提交时github时git会问,确认这是github官网?(英文),直接输入yes。
由于这个版本库可以多人使用(只有确认了SSH才能使用),所以有时候版本库在github上更新了,但在本机没有,这样回到只本机提交至云端时会出错,就要使用命令:
git pull origin master 表示将云端上的代码同步到本机来。
然后就可以提交了。
*管理分支
管理分支也是git的一大特色。
管理分支其实只有在那种很多人开发项目时才有用,但是还是学了,管理分支的应用场景为:很多人开发一个项目,但是因为有人的代码没有写完,就先保存到github上了,这样会导致别人无法工作,但是如果不提交又有数据丢失的风险,所以就可以新建一个分支,直接在这个分支上干活,每次提交都提交到这个分支上,当开发完成时,再把这个分支和主分支(master分支)合并,与主分支合并后删除当前的临时分支,完美的解决了这个问题,代码为:
git branch *** 表示新建一个分支,名为***。
git checkout *** 表示切换到这个分支,提后代码的提交也都是提交的这个分支上。
git checkout -b *** 表示直接新建并切换到***分支,相当于连用以上两句(方便)。
git branch 表示查看当前的所有分支,当前所在的分支前面会有一个"*"。
git branch merge *** 表示将***分支与当前分支合并(可能会有冲突,以后会学)。
git branch -d *** 表示删除***分支
原理很巧妙,网址:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000
*解决冲突
在之前提到过分支可能会冲突,比如说在master分支上有一个code.cpp里面为123123,在dev分支上有也有一个code.cpp,内容为323123123123,然后讲分支dev和matster合并,就会出错,因为code.cpp引起了冲突,再次打开code.cpp,发现里面的东西被git改变了,被git注释了,标出了与另一个分支不同的地方,这个问题需要手动解决,按照你想要的更改分支里的内容。
*分支策略管理
这只是一个策略性的东西,就是说master分支一定要是非常稳定的版本,平时不能在上面干活,等等,对现在没用,所以只贴一个网址:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758410364457b9e3d821f4244beb0fd69c61a185ae0000
然而这里还讲到了一个很重要的话题,几个语法,代码为:
git merge --no-ff -m "注释" *** 表示把***分支与当前分支合并,与普通方法的不同之处在与,这次合并是以一个commit的形式来完成的,也就是说会留下痕迹(普通的不会)。
还有一个重要的东西是git log 的几个参数,代码为:
git log --graph 用图标来表示之前的提交,效果很神奇。
git log --abbrev-commit 表示只显示提交代码的前几位数。
注意:以上的参数(包括--pretty=oneline)都是可以连用的。

*临时储存分支
这个功能感觉有点鸡助,不是那么的强大,代码为:
git stash 表示把当前的情况存储下来,没有提交的也会。
git stash list 表示输出之前的存储
git stash apply *** 表示把工作现场还原至***(不删除),其中***表示还原成第几个工作现状(stash可以保存多个),也可以不加,表示还原成最新的一个,如果要加的话,***应为stash@{你要的数字}。
git stash pop *** 同上,不过还原了以后会把备份删除。
*feature分支
这里又讲到了一个习惯问题,就是不要在master分支上工作,要在一个feature分支上工作,完成了在合并回去。
不过这里还讲到了一个语法:
git branch -D *** 表示强制删除一个分支(如果不用这个删除未合并的分支会出错)
*多人工作
只是名字高大上了点(其实也没有),意思是说,当你git clone某一个项目时,你会发现clone出来的项目只有master一个分支,但是你需要在dev分支上开发,所以你就需要打如下代码:
git branch dev origin/dev 表示新建一个分支dev,里面的内容为origin上的dev.
注意:在提交分支的时候要把后面的master改成dev
但是这样在提交分支的时候还会有一个问题,就是会和别人的dev冲突,解决方法之前讲到过。
*管理标签
标签git用来区分版本的东西,标签不能修改(因为用来标记版本),标签的代号是自己起名的。
代码:
git tag *** 表示打了一个名字为***的标签,也就是说当前版本为***,
git tag 表示查看所有标签
git tag -d *** 表示删除***标签
git push origin *** 表示讲***标签推送到github
git push origin --tags 表示推送所有标签到github

从github删除标签比较麻烦:
先在本地删除标签 git tag -d ***
然后在从github删除 git push origin :refs/tags/***
*管理远程仓库
代码:
git remote -v 表示查看当前目录下的远程库信息
git remote rm *** 表示删除名为***的远程链接,就比如origin
git remote add *** git@×××.com:用户名/项目名.git
表示与×××创建一个远程连接,名为***
注意:git的远程代码托管器并不止github一个,还有很多如码云,所以×××填的不一定是github.com
注意:***是远程连接的名字,这也意味着一个git仓库可以同时连接多个代码托管器。
注意:在学习了分支后,就可以知道,git push origin ***的***并不只是master,还可以是别的分支。。
————————————————————————————————————————————————————————
以下是各种补充:

10-6日,补充(百度上找的,不是很详细,先写上):
git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态(但是没有用commit提交)

10-7日,补充:
git add * 表示在版本库里添加所有未添加的文件
git rm . -r 表示在版本库里删除所有文件,慎用,慎用
git mv *** 表示移动或重命名***

10-8,补充:
git push -f *** ××× 表示强制讲×××分支推送到***链接上(直接覆盖),慎用,慎用!
git add * (*表示字符"*")同样可以用来删除文件

10-11,补充:
git fetch --all 表示下载云端上所有的数据,不更新
git reset --hard origin/master 表示将master恢复到已下载的云端最新版

10-13,补充:
git add -A 表示一次性把所有修改都添加到暂存区(包括删除之类的),git add -A .和git add .好像也可以
git add -u 表示一次性把所有跟踪了的文件的修改添加到暂存区(也就是不包括添加)

11-03,补充:
如果你手贱一不小心在没有commit 的情况下使用git reset --hard ***,那么你会发现你在***之后编辑的问价全都没了,但是你没有commit ,不能使用reflog,找了好久终于找到了,在.git/lost-fount/other里,有你所有删除的记录,你可以手动复制回这些文件,然后重命名,但是如果多了就不好办了,所以还是要勤commit

如何完全删除一个文件:
我们知道在git里总是后后悔药吃的,所以哪怕你在git版本库里删除了在.git里也找的到,如果是一个大文件,那么无疑会造成很大的困扰,所以需要用到强制删除:
git filter-branch --force --index-filter 'git \
rm --cached --ignore-unmatch password.txt' \
--prune-empty --tag-name-filter cat -- --all
注意:以上的命令一个都不能少写/简写!!!!!!!!!!!!!!!!!!!!!!!!!
以上命令的作用是将在版本库根目录的password.txt完全删除,无法回复(也就是在.git里找不到),当然也可换成别的,但是一定写的要是路径(如Doc/LG_Problem_list),一定不能少些/写错,毕竟这是有杀伤性的,同步到云端的话加-f参数强制同步
详细的:
--filter-branch表示**重**写每一个分支
--force 表示遇到冲突也让git强制执行,
--index-filter 表示指定重写的时候应该执行什么命令,要执行的命令紧跟在它的后面
'git rm --cached --ignore-unmatch password.txt' 紧跟在上一句的后面,表示删除匹配到的所有缓存
--prune-empty 表示如果删除导致某次提交变成了空提交,那么删除这个提交
--tag-name-filter-- 表示对每一个tag如何重命名,重命名的命令紧跟在后面,当前的tag名会从标注输入送给后面的命令,用cat就表示保持tag名不变
注意!!!:上一条命令后面一定要有--
--all 表示对所有的文件都考虑在内
注意:以上命令要在提交完成的时候运行
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×