m Github scm

Key Points


References

Reference_description_with_linked_URLs_______________________Notes______________________________________________________________
m Github Hello World Tutorial
https://git-scm.com/docsGIT docs **

git-cheat-sheet-education

git-cheat-sheet-education.pdf


getting-started-with-git/about-remote-repositories
git-clone-branch-how-to-clone-a-specific-branch
oracle-use-git-repositories.html
github-4-dummies-v2-2023    linkgithub-4-dummies-v2-2023




https://guides.github.com/activities/hello-world/Github basics - example
m Github Hello World Tutorial

Annotated version of Github Hello World tutorial





https://help.github.com/en/github/authenticating-to
-github/connecting-to-github-with-ssh
Github connection setup with SSH


https://desktop.github.com/

download Github desktop

Github Desktop docs  clone, fork etc   





https://github.com/pricingGithub pricing options - individual   team   enterprise
https://developer.github.com/v3/repos/Github repo APIs - v3
https://developer.github.com/v3/repos/releases/Github developer api to integrate Github into CICD flows






https://towardsdatascience.com/getting-started-with-git-and-
github-6fcd0f2d4ac6

github-tutorial-towardsdatascience.com-Getting started with
Git and GitHub the complete beginners guide.pdf

Git and Github basics with PR example


Bitbucket


geeksforgeeks--working-on-bitbucket-using-git

geeksforgeeks--working-on-bitbucket-using-git pdf

Good tutorial on using Bitbucket ***
https://www.idalko.com/bitbucket-vs-github/7 reasons Bitbucket better than github
https://www.geeksforgeeks.org/introduction-to-bitbucket/?ref=rpIntroduction to bitbucket





Key Concepts



Different Branching Strategies

https://www.flagship.io/git-branching-strategies/

git-branching-strategies-flagship.io-GitFlow Github Flow Trunk Based.pdf file

the Git branching model is lightweight compared to other version control systems; this is why it’s so easy and cheap to create branches in Git, as the whole code doesn’t need to be copied to the branch creating a large amount of duplicate files, as opposed to other VCS tools.



Client options to connect to Github 


Web browser 

Manage your Github repo online


Git client 

GIT command line client interface to push, pull files to your Github repo


Github Desktop


A nice, free GUI desktop for Github Windows users 


https://help.github.com/en/desktop/getting-started-with-github-desktop/overview


Install Github Desktop 

Download from here for Windows

https://desktop.github.com/


Login to your account

After installing Github Desktop, open it and hit Ctl + ( or File > Options ) to open up the login page 


Take the option to create a new repository ( repo )



after making changes to a branch ( master or other ) on the local repo, commit the changes to the local branch


Then publish this repo from your local file system to the Github server

>> push the origin ( local ) to Github




the repo address: 

https://github.com/jmason90/swt-hello1.git


Clone, Fork with Github Desktop 

https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/adding-and-cloning-repositories/cloning-and-forking-repositories-from-github-desktop






Connecting to Github 

You can setup a direct account with Github for free or use an account setup by your organization.

After you have registered, consider using a secure connection to Github 

In most cases, you'll prefer to have a secure TLS connection to Github using your PKI keys.

You check your profile on Github to see if you have a secure connection: 

https://github.com/settings/keys

This shows I don't have SSH keys associated with my account for Github access



Connecting to Github with SSH keys

https://help.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh



When you set up SSH, you will need to generate a new SSH key and add it to the ssh-agent. You must add the SSH key to your account on GitHub before you use the key to authenticate. For more information, see "Generating a new SSH key and adding it to the ssh-agent" and "Adding a new SSH key to your GitHub account."

To use your SSH key with a repository owned by an organization that uses SAML single sign-on, you must authorize the key. For more information, see "Authorizing an SSH key for use with SAML single sign-on" in the GitHub Enterprise Cloud documentation.



See 

m Linux Remote Access Tools#KeyGenerationforaccesstoremoteservices(Githubetc)

WindowsSubsystemforLinux

m Linux Remote Access Tools#GeneratinganewSSHkeypair



Git and Github Basics Tutorial

https://towardsdatascience.com/getting-started-with-git-and-
github-6fcd0f2d4ac6

github-tutorial-towardsdatascience.com-Getting started with
Git and GitHub the complete beginners guide.pdf

You’ll learn how to:

  • Create and use a repository
  • Start and manage a new branch
  • Make changes to a file and push them to GitHub as commits
  • Open and merge a pull request




create a branch

a branch


git checkout if the branch exists

git checkout [<branch>]

           To prepare for working on <branch>, switch to it by updating the

           index and the files in the working tree, and by pointing HEAD at the

           branch. Local modifications to the files in the working tree are  kept, so that they can be committed to the <branch>.


git checkout -b|-B <new_branch> [<start point>]

           Specifying -b causes a new branch to be created as if git-branch(1)

           were called and then checked out.



pull requests

Pull Requests are the heart of collaboration on GitHub. When you open a pull request, you’re proposing your changes and requesting that someone review and pull in your contribution and merge them into their branch. Pull requests show diffs, or differences, of the content from both branches. The changes, additions, and subtractions are shown in green and red.


Using Github: Sample Development Workflows

https://hyperledger-fabric.readthedocs.io/en/latest/github/github.html

github-example-hyperledger-fabric.readthedocs.io-GitHub Contributions.pdf


To protect the Hyperledger Fabric source code, and maintain a clean state in the official GitHub repositories, Hyperledger Fabric GitHub pull requests are accepted from forked repositories only. The act of forking a GitHub repository creates an identical copy of the repository in your personal GitHub account. You are then able to edit code and propose these changes to the official Hyperledger Fabric repositories you forked the code from via the GitHub pull request process.



Simple push to remote IF the local branch is AHEAD of the target remote origin


git help status


git status | more
On branch qa
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   package-lock.json
        modified:   package.json
        modified:   src/services/index.js
        modified:   yarn.lock

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        src/models/orders.model.js
        src/models/products.model.js
        src/services/orders/
        src/services/products/
        test/services/orders.test.js
        test/services/products.test.js

no changes added to commit (use "git add" and/or "git commit -a")


git add -a --dry-run

git add -A --dry-run
add 'src/services/offers/offers.hooks.js'
add 'src/services/trades/trades.hooks.js'

git add -A




git commit --dry-run

git commit --dry-run
On branch dev
Your branch is up to date with 'origin/dev'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/services/offers/offers.hooks.js
modified: src/services/trades/trades.hooks.js


git commit -m 'my message - author'

git commit -m 'fixed trade accounting, offer status - jim'
On branch dev
Your branch is ahead of 'origin/dev' by 1 commit.
(use "git push" to publish your local commits)

nothing to commit, working tree clean




git push --atomic --dry-run

git push --atomic --dry-run
To github.com:Paramount-Software-Solutions/ebc-api.git
a5d33e6..d151083 dev -> dev


git push --atomic

Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 8 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 1021 bytes | 510.00 KiB/s, done.
Total 8 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
To github.com:Paramount-Software-Solutions/ebc-api.git
a5d33e6..d151083 dev -> dev


// IF there is no content in an upstream branch - the --dry-run shows the right command to push to a new branch

git push --atomic --dry-run
fatal: The current branch orders has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin orders


git push --set-upstream origin orders
Enumerating objects: 34, done.
Counting objects: 100% (34/34), done.
Delta compression using up to 8 threads
Compressing objects: 100% (23/23), done.
Writing objects: 100% (23/23), 3.63 KiB | 1.21 MiB/s, done.
Total 23 (delta 14), reused 0 (delta 0)
remote: Resolving deltas: 100% (14/14), completed with 11 local objects.
To github.com:Paramount-Software-Solutions/ebc-v2-api.git
   bbbd5c7..9ef52d3  orders -> orders
Branch 'orders' set up to track remote branch 'orders' from 'origin'.


3 way merge with GIT CLI

        3. When a merge conflict happens during switching branches with the -m
           option, you would see something like this:

               $ git checkout -m mytopic

               Auto-merging frotz
               ERROR: Merge conflict in frotz
               fatal: merge program failed

           At this point, git diff shows the changes cleanly merged as in the
           previous example, as well as the changes in the conflicted files.
           Edit and resolve the conflict and mark it resolved with git add as
           usual:

               $ edit frotz
               $ git add frotz



Using GIT commands from CLI offers a few extras


things to do from GIT CLI

clone

pull

list

add

set origin

push --dry-run

push --force


also:   rebase, reset, pull request

==========================================
Begin session with git pull

Work on the files (I don't even do 'branches')

when finished, I run the shell script

echo "Insert git commit comments"

read COMM

git add -A

git commit -m "$COMM"

git push

it works fine

------------------
>> see what changes will be pushed 
------------------

git add -A

git commit --dry-run -m 'fix create device, trades jem'   

git push  --dry-run


------------------
output 

git commit --dry-run -m 'fix create device, trades jem'  
On branch dev
Your branch is up to date with 'origin/dev'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   .vscode/launch.json
	modified:   package-lock.json
	modified:   package.json
	modified:   src/services/accounts/accounts.hooks.js
	modified:   src/services/devices/devices.hooks.js
	modified:   src/services/trades/trades.hooks.js
	modified:   yarn.lock


------------------
>> push changes normally when the ancestor is latest commit
------------------

git add -A

git commit -m 'fix create device, trades jem'   

git push 




git remote set-url origin https://github.com/Paramount-Software-Solutions/ebc-api.git


cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC3cyQ/Z32NT5E29pU3SK9zXaaiai0Oy1wEyki0A97YWh6LBtaOziQHnbbfZ/yzOF0Xg3aC2nc17g8nNy4oddDM8LZGRw0s+zntygaIQVsW539nribM+oSQrucQyass/dC4+8bUx0Brnn9iyBwQLWSQClzc6wt9tohbJp642Q854zYkj5cM84M0kajJsDW2sZpYWPezRN9DN0vWhnWxteroR62PFkqW4zBaW4keUEewQYGMUN/rl7jTspnfAwVrwdyJt4mGlUtIUYhFnsQoYrDDALDGrZmdt8x4JHIgQfq+caFNNdrlDhuc1j0wXR/nUXXYx5uiUWcJQAZUQdSqhupM6ltba/d/CXZSdH9yBLMGxQ20M6SRUfNitDgmnXZEn9a+dP4a8WLeIQ2kQtO6oqKsaoLBOSgG0zGCnb8Zrr/BEg0dWTjCIPU7FcvwkwrjnhY8jQk/AWD8AZS+ZOYwmmUzm4u0YPpJ4eqUWs+gTXTPf+5AKEAzZxHd/40FYCzICpE= jimmason@ip-10-0-0-103.us-east-2.compute.internal

https://github.com/settings/keys

git remote set-url origin git@github.com:Paramount-Software-Solutions/ebc-api.git


---------------
move to qa after dev>>
---------------

git checkout qa
git merge dev
git push


---------------
gen frontend for feathers 

marmalab v2 only for web sockets


---------------
call from 1 app to 2nd app i 


------------------
>> force the changes overriding other commits on origin 
------------------

git add -A --force 

git commit --dry-run --no-verify -m 'fix create device, trades jem'   

git push --force


------------------

------------------
git add 

This command updates the index using the current content found in the
       working tree, to prepare the content staged for the next commit. It
       typically adds the current content of existing paths as a whole, but
       with some options it can also be used to add content with only part of
       the changes made to the working tree files applied, or remove paths
       that do not exist in the working tree anymore.


------------------
git commit

https://git-scm.com/docs/git-commit

Create a new commit containing the current contents of the index and the given log message describing the changes. The new commit is a direct child of HEAD, usually the tip of the current branch, and the branch is updated to point to it (unless no branch is associated with the working tree, in which case HEAD is "detached" as described in git-checkout[1]).

The content to be committed can be specified in several ways:

by using git-add[1] to incrementally "add" changes to the index before using the commit command (Note: even modified files must be "added");

by using git-rm[1] to remove files from the working tree and the index, again before using the commit command;

-n
--no-verify
This option bypasses the pre-commit and commit-msg hooks. See also githooks[5].

--dry-run

The --dry-run option can be used to obtain a summary of what is included by any of the above for the next commit by giving the same set of parameters (options and paths).


------------------
git reset

If you make a commit and then find a mistake immediately after that, you can recover from it with git reset.




------------------
git push 

git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
	   [--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
	   [-u | --set-upstream] [-o <string> | --push-option=<string>]
	   [--[no-]signed|--signed=(true|false|if-asked)]
	   [--force-with-lease[=<refname>[:<expect>]] [--force-if-includes]]
	   [--no-verify] [<repository> [<refspec>…​]]

DESCRIPTION
Updates remote refs using local refs, while sending objects necessary to complete the given refs.

You can make interesting things happen to a repository every time you push into it, by setting up hooks there. See documentation for git-receive-pack[1].

When the command line does not specify where to push with the <repository> argument, branch.*.remote configuration for the current branch is consulted to determine where to push. If the configuration is missing, it defaults to origin.

When the command line does not specify what to push with <refspec>... arguments or --all, --mirror, --tags options, the command finds the default <refspec> by consulting remote.*.push configuration, and if it is not found, honors push.default configuration to decide what to push (See git-config[1] for the meaning of push.default).

When neither the command-line nor the configuration specify what to push, the default behavior is used, which corresponds to the simple value for push.default: the current branch is pushed to the corresponding upstream branch, but as a safety measure, the push is aborted if the upstream branch does not have the same name as the local one.

-f
--force
Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it. Also, when --force-with-lease option is used, the command refuses to update a remote ref whose current value does not match what is expected.

This flag disables these checks, and can cause the remote repository to lose commits; use it with care.


--push-option=<option>
Transmit the given string to the server, which passes them to the pre-receive as well as the post-receive hook. The given string must not contain a NUL or LF character. When multiple --push-option=<option> are given, they are all sent to the other side in the order listed on the command line. When no --push-option=<option> is given from the command line, the values of configuration variable push.pushOption are used instead.

--receive-pack=<git-receive-pack>
--exec=<git-receive-pack>
Path to the git-receive-pack program on the remote end. Sometimes useful when pushing to a remote repository over ssh, and you do not have the program in a directory on the default $PATH.

--[no-]force-with-lease
--force-with-lease=<refname>
--force-with-lease=<refname>:<expect>
Usually, "git push" refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it.

This option overrides this restriction if the current value of the remote ref is the expected value. "git push" fails otherwise.



==========================================


------------------
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone     Clone a repository into a new directory
   init      Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add       Add file contents to the index
   mv        Move or rename a file, a directory, or a symlink
   restore   Restore working tree files
   rm        Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect    Use binary search to find the commit that introduced a bug
   diff      Show changes between commits, commit and working tree, etc
   grep      Print lines matching a pattern
   log       Show commit logs
   show      Show various types of objects
   status    Show the working tree status

grow, mark and tweak your common history
   branch    List, create, or delete branches
   commit    Record changes to the repository
   merge     Join two or more development histories together
   rebase    Reapply commits on top of another base tip
   reset     Reset current HEAD to the specified state
   switch    Switch branches
   tag       Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch     Download objects and refs from another repository
   pull      Fetch from and integrate with another repository or a local branch
   push      Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.


NODE_ENV=devLocal  PORT=3030   npm start


==========================================
vscode debug 
==========================================

open debug terminal
set code breakpoints
when running to breakpoint
view variables in a watchlist
or hover over variable to view attributes


context is the default object for a request contains
app.(req,res, next)
arguments
data ( from post )
variables from cdm lin as a key map
params ( if entered on the request )
path ( the relative url )
service ( service properties for the feathers service )
toJSON ( normally empty )
type:  ( feathers request life cycle - before or after )
__proto__ ( the object prototype if defined )


in debug console, enter debug commands

console.log(`context.data : ${JSON.stringify(context.data)} \n`);
undefined
context.data : {"offerKWH":"120","rate":0.5,"startTS":"2021-02-28T07:21","endTS":"2021-07-04T07:21"} 


==========================================
create PR to merge code to another branch
==========================================

given DEV latest version, 
create PR to merge from DEV to QA

To request that changes from your branch are merged into another branch, in the same repository or in another repository in the network, you can create a pull request on GitHub Desktop


-------------------------

commit latest to dev branch

compare fend dev to qa

https://github.com/Paramount-Software-Solutions/ebc-frontend/commit/5eb47481d15a743dc4d382662983e68ff46b1a3f

qa
https://github.com/Paramount-Software-Solutions/ebc-frontend/commit/7e6c780a3f68f295ca3226d5cd6f2c905e00795b


hard-coded constants file 
not using NODE_ENV like ebc-api

https://github.com/Paramount-Software-Solutions/ebc-frontend/compare/7e6c780a3f68f295ca3226d5cd6f2c905e00795b..5eb47481d15a743dc4d382662983e68ff46b1a3f

;
 API_URL = 'https://ebc-api-dev.sysopsnetwork.com/';

API_URL = 'https://ebc-api-qa.sysopsnetwork.com/';

==========================================
==========================================




Github changing services beyond SCM

Github was secure SCM for teams with integration points to JIRA, Slack etc

Github ( or GIT if hosted in-house ) has become the standard for SCM - source code management


Github now adding new services:

  1. CICD build pipelines billed as Github action minutes
  2. wikis
  3. project management
  4. code scans
  5. team collaboration

The strategy of expanding the Github suite creates 2 problems

  1. paying for services you don't need as in any suite bundle
  2. future added services in the bundle will increase licensing costs again
  3. dropping down to lower levels of functionality than competitive products
  4. the tools that have low usage in the Github suite will have more defects that take longer to fix ( Jim's "law of suites" )

CICD tool chains

  1. The negative on the CICD build services is the limits and overage charges set.
  2. This should be compared to the costs of running CICD leaders such as Jenkins or CircleCI on-premise or in the cloud
  3. Is it worth testing Github CICD actions ?  only if compared to the current CICD leaders which are compatible with any environment
    1. Jenkins  
      1. using Docker containers in Jenkins CICD flows
          
    2. Circle CI

Other Github services

While any of these add on services are useful to some degree, they won't compare to the industry standard tools in these areas

Jira is far better for managing Sprints, Kanban ( https://www.atlassian.com/software/jira/features )

Confluence is a better wiki solution and knowledge base ( https://www.atlassian.com/software/confluence/features  )

MS Project handles project management better ( even GSuite GSheets can do basic project management better )  ( https://gsuite.google.com/features/ )

OWASP tools are free and the industry standard for code scans for vulnerability assessments ( https://www.owasp.org/index.php/Free_for_Open_Source_Application_Security_Tools )

Real time collaboration leaders include ( Gmail          Zoom       Slack    Skype     )



Jenkins for CICD

see m CICD tool chains

Youtube - Deploy Docker Microservices on Jenkins - 20 mins


Github API access for CICD integration


Github v3x API catalog

https://developer.github.com/v3/

This describes the resources that make up the official GitHub REST API v3. If you have any problems or requests, please contact GitHub Support.


Github v3x API repo services

https://developer.github.com/v3/repos/



Github v3x API Events

https://developer.github.com/v3/activity/

Activity

Serving up the "social" in Social Coding, the Activity APIs provide access to notifications, subscriptions, and timelines.

Events

The Events API is a read-only interface to all the event types that power the various activity streams on GitHub.

Feeds

List of Atom feeds available for the authenticated user.

Notifications

Notifications of new comments are delivered to users. The Notifications API lets you view these notifications and mark them as read.

Starring

Repository Starring is a feature that lets users bookmark repositories. Stars are shown next to repositories to show an approximate level of interest. Stars have no effect on notifications or the activity feed.

Watching

Watching a Repository registers the user to receive notifications on new discussions, as well as events in the user's activity feed.


GIT Data v3x API

https://developer.github.com/v3/git/

Manage GIT data directly instead of using the standard object API's.

Comes with a risk of corrupting GIT data if done incorrectly.

The Git Database API gives you access to read and write raw Git objects to your Git database on GitHub and to list and update your references (branch heads and tags).

This basically allows you to reimplement a lot of Git functionality over our API - by creating raw objects directly into the database and updating branch references you could technically do just about anything that Git can do without having Git installed.

Git Database API functions will return a 409 Conflict if the Git repository is empty or unavailable. An unavailable repository typically means GitHub is in the process of creating the repository. For an empty repository, you can use the Create a file endpoint to create content and initialize the repository so you can use the Git Database API. Contact GitHub Support if this response status persists.

git db

For more information on the Git object database, please read the Git Internals chapter of the Pro Git book.

As an example, if you wanted to commit a change to a file in your repository, you would:

  • Get the current commit object
  • Retrieve the tree it points to
  • Retrieve the content of the blob object that tree has for that particular file path
  • Change the content somehow and post a new blob object with that new content, getting a blob SHA back
  • Post a new tree object with that file path pointer replaced with your new blob SHA getting a tree SHA back
  • Create a new commit object with the current commit SHA as the parent and the new tree SHA, getting a commit SHA back
  • Update the reference of your branch to point to the new commit SHA

It might seem complex, but it's actually pretty simple when you understand the model and it opens up a ton of things you could potentially do with the API.


Process to Check Mergeability of Pull Requests

https://developer.github.com/v3/git/

Warning! Please do not depend on using Git directly or GET /repos/:owner/:repo/git/refs/:ref for updates to merge Git refs, because this content becomes outdated without warning.

A consuming API needs to explicitly request a pull request to create a test merge commit. A test merge commit is created when you view the pull request in the UI and the "Merge" button is displayed, or when you get, create, or edit a pull request using the REST API. Without this request, the merge Git refs will fall out of date until the next time someone views the pull request.

If you are currently using polling methods that produce outdated merge Git refs, then GitHub recommends using the following steps to get the latest changes from the base branch (usually master):

  1. Receive the pull request webhook.
  2. Call GET /repos/:owner/:repo/pulls/:pull_number to start background job for creating the merge commit candidate.
  3. Poll your repository using GET /repos/:owner/:repo/pulls/:pull_number to see if the mergeable attribute is true or false. You can use Git directly or GET /repos/:owner/:repo/git/refs/:ref for updates to merge Git refs only after performing the previous steps.



One Process to Rebase repos after a repo rename 

Here is the process that I will be following for each repository:

- Use the new Github feature to rename default branch. This automatically re-targets PRs to "main" and updates branch protections rules.

- PR to update master references in CI pipelines, docs, etc

- Update default branch in Azure Pipelines



Once it is done for a repository, each developer that has a local fork will need to perform the following steps to update their local environment, push the main branch to their fork and associate with local main branch, and ensure local main is rebased on the upstream main branch:

git checkout master

git branch -m master main

git fetch origin

git push origin main

git branch -u origin/main main

git fetch upstream

git rebase upstream/main



The steps assume you are following the Github fork and upstream remote instructions here:

https://hyperledger-fabric.readthedocs.io/en/latest/github/github.html



Please let us know if you have any other suggestions or comments.


Bitbucket


Bitbucket intro

https://www.geeksforgeeks.org/introduction-to-bitbucket/?ref=rp




Bitbucket Tutorial

geeksforgeeks--working-on-bitbucket-using-git

geeksforgeeks--working-on-bitbucket-using-git pdf





Potential Value Opportunities



Potential Challenges



Candidate Solutions



Step-by-step guide for Example



sample code block

sample code block
 



Recommended Next Steps