-
Notifications
You must be signed in to change notification settings - Fork 0
/
Git_Notes.txt
367 lines (335 loc) · 15.3 KB
/
Git_Notes.txt
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
---------
Git Notes
---------
git add <FILE1> <FILE2>...|-A # add [FILES]|All changes to staging area
git branch [-a|-d|-r] [<BRANCH_NAME>] # list|create|delete branches & current
git branch NEW_BRANCH # create new branch
git branch -a # list both remote and local branches
git branch -r # list remote branches
git branch -d [-r] # delete local[remote] branch
# git branch -d -r origin/nubranch # deletes remote-tracking
# using branches to make then merge changes in a new branch on to master
1. git checkout -b NEW_BRANCH # create and checkout new branch
(or `git branch NEW_BRANCH; git checkout NEW_BRANCH)
2. (edit/make changes to files) # make code changes
3. git add "modified files" # add modified files to staging area
4. git commit -m "commit messages" # commit your changes
5. git checkout master # switch to master
6. git merge NEW_BRANCH # merge changes on to master
# rename a branch locally and remotely and reset upstream
git branch -m [OLD_NAME] NEW_NAME # use OLD_NAME if not on branch
git push origin -u NEW_NAME # push local branch and reset upstream branch
git push origin --delete OLD_NAME # delete the OLD from remote
git branch -m <newname> # To rename the current branch:
git branch -m <oldname> <newname> # To rename a branch while pointed to any branch:
git checkout [-b] <BRANCH>|<TAG> [<FILE>] # checkout a git reference
git checkout <BRANCH> <FILE> # revert changes to <FILE>
git checkout HEAD aws_tags.py # revert changes made to aws_tags.py
git checkout NEW_BRANCH # switch HEAD to NEW_BRANCH
git checkout master # switch HEAD to master
git checkout -b new_branch # create and checkout a new branch
git checkout -b new_branch existing_tag # start from known tag
git checkout -b new_branch origin/existing_branch # dev from known branch
git checkout --track origin/existing_branch # dev from known branch
git checkout origin/master -- path/to/file # get one file
git clone <REMOTE_LOC> [<CLONE_NAME>] # git clone a repo
git commit [--allow-empty] -m "message" # commit changes in staging area
git config [<file-option>] # man git-config
file-options
--system (/etc/gitconfig)
--global (~/.gitconfig | ~/.config/git/config)
--local (.git/config)
git config --local user.email [email protected]
git config user.name "Patrick Raco" # defaults to "--local"
git config --global color.ui auto # turn on color globally
git config --global alias.co checkout
git config --global alias.ec 'config --global -e'
git config --list --show-origin # view all settings and where they are set
git diff # show changes made
git diff [--name-only] HEAD^ # last files|changes commited
git diff HEAD^ $FILE
git diff [--name-only] BRANCH # files/changes between current/another branch
git show [--name-only] <SHA1> <SHA2> # diffs between 2 commits
git log --format="%H" -n 1 # last git commit
git show --pretty="" --name-only $GIT_COMMIT # changed files in commit
git diff-tree --no-commit-id --name-only -r $GIT_COMMIT # same
git diff --name-only HEAD@{0} HEAD@{1} # changed files since last push (local)
git diff --name-only HEAD HEAD^ # changed files between last 2 HEADs
git fetch # bring changes into 'remote' branch
git init # initialize a repo
git log # show Git commits
git log -- FILE # show commits FILE changed in
git log -p FILE # show commits and changes of file
git ls-files [*.zip] # list cached files
git ls-remote # list references in a remote repo
git ls-remote --tags origin vm-1517* # list references matching vm-1517*
git merge <BRANCH> # after switching to the receiving branch
git merge origin/master
git push [-u] [origin <BRANCH>]
git push -u origin new_branch # add upstream (tracking) ref for branches too
git push [-f] origin --delete ref # (force) delete ref from remote repo
git push origin :ref # (deprecated) delete ref from remote repo
git push --repo=REPO :ref # delete ref from specified remote repo
git push -u origin master
git rebase -i HEAD~n # change commit messages
a) (editor opens with list of commits, change "pick" to "edit")
git commit --amend
git commit --continue
b) (editor opens with list of commits, change "pick" to "reword")
git push --force
git reset --soft HEAD~1 # revert last commit
git reset [HEAD] <FILE> # revert changes | unstage a file
git reset <SHA> # revert back to a SHA (can use first 7 chars)
git remote -v # see a list of Git project's remotes
git remote add origin https://github.com/pataraco/notes.git
git remote set-url origin git@stor2:cloud_automation
git remote set-url --add --push origin git@stor2:cloud_automation
git remote set-url --add --push origin ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/cloud_automation
git rm [--cached] \*.zip # remove [cached] files (that were tracked and now in gitignore)
git show HEAD|<BRANCH> # show info on
git show <BRANCH>:path/to/file # show contents of file
git show-ref --[heads|tags]
git symbolic-ref HEAD
git stash # stash the changes in a dirty working dir away
git stash list
git stash apply [stash@{2}]
git status # show staging area status
git tag # create, list, del, verify tag object
git tag -a ref -m "tag message" # make unsigned, annotated tag object w/msg
git tag -f vm-1605-rc-1
git push origin --tags
git tag -l vm-1517* # list remote tags
git fetch --all --tags --prune # fetch all remotes/tags
git tag -d TAG # delete local tag
git push origin --delete TAG # delete remote tag
# check if need to pull
$ git remote update
$ git status -uno
# show changes made in a specific branch
$ git log -p develop..mybranch
$ git cherry -v develop mybranch
_____________________________________
| GitHub Tips |
# create a new repository on the command line
mkdir NAME_OF_REPO
cd NAME_OF_REPO
echo "# NAME_OF_REPO" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/pataraco/NAME_OF_REPO.git
git push -u origin master
# push an existing repository from the command line
git remote add origin https://github.com/pataraco/NAME_OF_REPO.git
git push -u origin master
# use API and curl to get and do some stuff
GITHUB_OWNER="pataraco"
GITHUB_REPO="notes"
GITHUB_TOKEN=$(
aws ssm get-parameter \
--name /github/users/pataraco/oauthtoken \
--with-decryption \
--query Parameter.Value \
--output text
)
REF=master
URI=https://api.github.com
API_VERSION=v3
API_HEADER="Accept: application/vnd.github.${API_VERSION}+json"
AUTH_HEADER="Authorization: token ${GITHUB_TOKEN}"
# get default branch
curl -X GET -fsSL -H "${AUTH_HEADER}" -H "${API_HEADER}" \
"${URI}/repos/${GITHUB_OWNER}/${GITHUB_REPO}" | jq .default_branch
# list branches
curl -X GET -fsSL -H "${AUTH_HEADER}" -H "${API_HEADER}" \
"${URI}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/branches" | jq .[].name
# list head refs
curl -X GET -fsSL -H "${AUTH_HEADER}" -H "${API_HEADER}" \
"${URI}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/git/refs/heads" | jq .[].ref
# is branch protected
curl -X GET -fsSL -H "${AUTH_HEADER}" -H "${API_HEADER}" \
"${URI}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/branches/${REF}" | jq .protected
# list number & ref of closed PRs
curl -X GET -fsSL -H "${AUTH_HEADER}" -H "${API_HEADER}" \
"$URI/repos/${GITHUB_OWNER}/${GITHUB_REPO}/pulls?state=closed" | jq '.[]|(.number|tostring)+" "+.head.ref'
# list PR with ref as the base
curl -X GET -fsSL -H "${AUTH_HEADER}" -H "${API_HEADER}" \
"$URI/repos/${GITHUB_OWNER}/${GITHUB_REPO}/pulls?state=open&base=${REF}"
# delete a branch
curl -X DELETE -sSL -H "${AUTH_HEADER}" -H "${API_HEADER}" \
--output /dev/null --write-out "%{http_code}" \
"${URI}/repos/${GITHUB_OWNER}/${GITHUB_REPO}/git/refs/heads/${REF}"
# http codes: 204 = success, 422 = does not exist
|_____________GitHub_Tips_____________|
MISC
----
# cat .gitconfig
[credential "https://github.com/comtech-et/cloud_automation"]
helper = store
# cat .git-credentials
https://$TOKEN:[email protected]
----
# git bash autocompletion
#OLD#curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash > ~/.git-completion.sh
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash > ~/.git-completion.sh
# git prompt
#OLD#curl https://raw.github.com/git/git/master/contrib/completion/git-prompt.sh > ~/.git-prompt.sh
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh > ~/.git-prompt.sh
# Rename GitHub Repo
# (careful running the following - save copy of config first. or just change $repo/.git/config manually)
$ git remote rm origin
$ git remote add origin $URL
_____________________________________
| GitHub Rebase Workflow |
# single environment (master & FEATURE_BRANCH)
[master] git fetch -p origin
[master] git rebase -i origin/master
[master] git co $FEATURE_BRANCH
[FEATURE_BRANCH] git rebase master $FEATURE_BRANCH -i
[master] git co master
[master] git merge $FEATURE_BRANCH
... hack, commit...
[master] git tag -a $VERSION HEAD
[master] git push origin master --tags
# multiple environments (DEV, TEST, PROD, etc.)
... hack, test, commit...
[DEV] git fetch -p origin
[DEV] git rebase -i origin/DEV DEV
[DEV] git push origin DEV
[DEV] git co PROD
[PROD] git merge --no-ff DEV
[PROD] git push origin PROD
|________GitHub_Rebase_Workflow_______|
____________________________________________
| GitHub ENV Branching Workflow |
(dev: development, stg: staging, master: prd)
www.wearefine.com/news/insights/env-branching-with-git
[master] $ git pull --rebase origin master # grab latest origin/master
[master] $ git checkout -b feature # create/checkout feature branch
[feature] $ hack... hack... hack... # hack
[feature] $ git add -A # stage changes
[feature] $ git commit -m "message" # commit changes
# release to dev
[feature] $ git pull --rebase origin master # rebase from origin/master
[feature] $ git checkout dev # switch to dev
[dev] $ git pull --rebase origin dev # rebase from origin/dev
# push feature, create PR (feature -> dev) and merge
[feature] $ git push origin feature # push changes
# or merge manually
[dev] $ git merge feature # merge in feature branch
[dev] $ git push origin dev # push changes (triggers dev build)
# release to stg
[dev] $ git checkout feature # checkout feature branch
[feature] $ git pull --rebase origin master # rebase from origin/master
[feature] $ git checkout stg # switch to stg
[stg] $ git pull --rebase origin stg # rebase from origin/stg
# push feature, create PR (feature -> stg) and merge
[feature] $ git push origin feature # push changes
# or merge manually
[stg] $ git merge feature # merge in feature branch
[stg] $ git push origin stg # push changes (triggers stg build)
# release to prd
[stg] $ git checkout feature # checkout feature branch
[feature] $ git pull --rebase origin master # rebase from origin/master
# push feature, create PR (feature -> prd) and merge
[feature] $ git push origin feature # push changes
# or merge manually
[master] $ git merge feature # merge in feature branch
[master] $ git push origin master # push changes (triggers prd build)
|________GitHub_ENV_Branching_Workflow_______|
___________________________________________
| Git Merge Conflicts Workflow |
[FEATURE] git fetch -p origin
[FEATURE] git rebase -i origin/master
[FEATURE] vi CONFLICTING_FILE(s) # repeat for additional conflicts
[FEATURE] git add CONFLICTING_FILE(s) # " " " "
[FEATURE] git rebase --continue # " " " "
[FEATURE] git push origin FEATURE --force # " " " "
--- OR ---
[master]$ git fetch -p origin
[master]$ git merge origin/master
[master]$ git checkout FEATURE
[FEATURE]$ git rebase -i master # using local master now because
# it is in sync with origin/master
[FEATURE]$ vi $CONFLICTING_FILE
[FEATURE]$ git add $CONFLICTING_FILE
[FEATURE]$ git rebase --continue # performs git commit
[FEATURE]$ git push origin FEATURE --force
|________Git Merge Conflicts Workflow_______|
___________________________________________
| Git Pre Commit Hooks |
example (.pre-commit-config.yaml)
---
repos:
- repo: git://github.com/antonbabenko/pre-commit-terraform
rev: v1.12.0
hooks:
- id: terraform_fmt
- id: terraform_docs
- repo: git://github.com/pre-commit/pre-commit-hooks
rev: v1.3.0
hooks:
- id: check-merge-conflict
---
|________Git Pre Commit Hooks______________|
___________________________________________
| Git Secrets Finders/Blockers |
https://geekflare.com/github-credentials-scanner/
https://github.com/awslabs/git-secrets
https://github.com/dxa4481/truffleHog
|________Git Secrets Finders/Blockers______|
______________________________
| Git Config Tips |
# file: $REPO/.git/config
[remote "origin"]
url = [email protected]:pataraco/REPO
fetch = +refs/heads/*:refs/remotes/origin/*
[user]
username = pataraco
email = [email protected]
# file: ~/.ssh/config
# Personal GitHub
Host par.github.com
HostName github.com
User pataraco
IdentityFile ~/.ssh/pataraco_github_rsa
# file: $REPO/.git/config
# purpose: use hooks to prevent secrets from being pushed to repo
[secrets]
providers = git secrets --aws-provider
patterns = (A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}
patterns = (\"|')?(AWS|aws|Aws)?_?(SECRET|secret|Secret)?_?(ACCESS|access|Access)?_?(KEY|key|Key)(\"|')?\\s*(:|=>|=)\\s*(\"|')?[A-Za-z0-9/\\+=]{40}(\"|')?
patterns = (\"|')?(AWS|aws|Aws)?_?(ACCOUNT|account|Account)_?(ID|id|Id)?(\"|')?\\s*(:|=>|=)\\s*(\"|')?[0-9]{4}\\-?[0-9]{4}\\-?[0-9]{4}(\"|')?
allowed = AKIAIOSFODNN7EXAMPLE
allowed = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# file: $REPO/.git/config
# purpose: add an additional remote (use: git push awscc)
[remote "awscc"]
# url = https://git-codecommit.us-west-2.amazonaws.com/v1/repos/infrastructure-automation
url = ssh://git-codecommit.us-west-2.amazonaws.com/v1/repos/infrastructure-automation
fetch = +refs/heads/*:refs/remotes/awscc/*
|________Git Config Tips ______|
__________________________________________
| Git Remove Changes and untracked files |
git reset --hard # removes staged and working directory changes
git clean -f -d [-n] # remove untracked files/directories [dry-run]
|__Git Remove Changes and untracked files__|
______________________________
| Git Remove All History |
# resets the repo to removoe sensitive data
$ git checkout --orphan temp
$ # remove any sensitive data
$ git add -A
$ git commit -am "Initial Commit"
$ git branch -D master
$ git branch -m master
$ git push -f origin master
|___Git Remove All History_____|
______________________________
| Git Debug Tips |
export GIT_TRACE_PACKET=1
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1
export GIT_TRANSFER_TRACE=1
|________Git Debug Tips ______|
tags: git